2010-09-16 6 views
0

J'ai une base de données exemple comme celle-ci, dans laquelle, id est toujours unique, mais l'id_utilisateur n'est pas unique.champ unique de la base de données mysql à php

id, user_id, message, msg_datetime
111, u1, msg de u1, actuellement ici
112, u2, msg de u2, actuellement ici
113, u3, msg de u3, le temps présent ici
114, u2, msg de u2, actuellement ici
115, U7, msg de U7, le temps présent ici
116, u2, msg de u2, actuellement ici
117, u1, msg de u1, temps présent ici
118, u5, msg de u5, heure présente ici

donc je veux attraper seulement les utilisateurs uniques qui ont envoyé des messages et les commander dans DESC par msg_datetime.

C'est la requête que j'ai. J'ai une erreur:
de l'aide ici? Quelle est la syntaxe correcte pour ce que j'essaie d'accomplir? Je veux montrer une seule entrée pour chaque utilisateur, peu importe quel ID je montre mais seulement 1 par utilisateur.

Répondre

1

Si vous ne vous souciez pas qui enregistrent avec la même requête user_id devrait revenir, puis

SELECT id,user_id,msg_datetime FROM table_1 GROUP BY user_id ORDER BY msg_datetime DESC

Si vous souhaitez afficher, par exemple, le dernier enregistrement pour chaque utilisateur, vous avez besoin

SELECT a.user_id, a.last_time, b.id 
FROM 
(SELECT user_id, MAX(msg_datetime) as last_time 
FROM table1)a 
INNER JOIN table1 b ON (b.user_id = a.user_id AND b.msg_datetime = a.last_time) 

ORDER BY a.last_time; 
+0

Hey regarde ceci votre premier code l'a résolu. Génial. Merci :) –

0

syntaxe SELECT:

SELECT (fieldlists) 
FROM (table) 
[WHERE (conditions)] 
ORDER BY (something) 

Vous avez oublié kindof dire quelle table vous voulez les données.

+0

J'ai le nom de la table dans mon code, juste que je ne le montre pas ici. –

0

Vous ne comprenez pas comment fonctionne DISTINCT. Cela fonctionne sur lignes pas champs. Ce que vous voulez, c'est un maximum groupwise, aussi connu comme le plus grand-n-par-groupe.

est ici une façon de le faire dans MySQL:

SELECT id, user_id, message, msg_datetime 
FROM (
    SELECT 
     id, user_id, message, msg_datetime, 
     @rn := CASE WHEN @prev_user_id = user_id 
        THEN @rn + 1 
        ELSE 1 
       END AS rn, 
     @prev_user_id := user_id 
    FROM (SELECT @prev_user_id := NULL) vars, Table1 T1 
    ORDER BY user_id, msg_datetime DESC 
) T2 
WHERE rn = 1 
ORDER BY msg_datetime 
Questions connexes