2010-12-08 29 views
1

Je suis en train d'écrire une requête où je voudrais obtenir une liste des derniers « actions spéciales » des utilisateurs, j'ai donc ces tableaux:MySQL: Obtenir l'action la plus récente par ligne

table_users 
id  username  email   etc. 
1  moloc  [email protected]  etc. 
2  lilly  [email protected]  etc. 
3  sammm  [email protected]  etc. 


table_special_actions 
id  user_id  action_id  date 
1  3   25    2010-11-01 22:51:56 
2  3   37    2010-11-02 18:09:33 
3  3   265   2010-11-03 07:20:12 


table_actions 
id  action 
1   Open a secret 
2   Level up 
3   Open magic door 
etc.  etc. 

mon objectif est d'obtenir une liste d'utilisateurs où je n'ai que la dernière action spéciale pour chacun d'eux, donc j'ai pensé que quelque chose comme ceci:

SELECT * 
FROM table_users AS users 
LEFT JOIN (
    SELECT user_id, action_id, MAX(date) AS action_date 
    FROM table_special_actions 
    GROUP BY user_id 
    ORDER BY action_date 
) s_actions 
ON s_actions.user_id = users.user_id 
LEFT JOIN table_actions AS actions 
ON s_actions.action_id = actions.id 

cela ne fonctionne pas correctement, car il est de retour ceci:

-----users----- ------------s_actions------------ -----actions----- 
id  username action_id  date     action 
3  sammm  25   2010-11-03 07:20:12 Action linked to action_id 25 

Je l'ai attendu à obtenir ceci:

-----users----- ------------s_actions------------ -----actions----- 
id  username action_id  date     action 
3  sammm  265   2010-11-03 07:20:12 Action linked to action_id 265 

La chose étrange est le action_id, je reçois toujours la dernière date et c'est ok, mais je l'ai aussi toujours faire le poing action_id au lieu de celui par rapport à la ligne de date correcte.

Où est-ce que je me trompe?

+0

changer action_id, max (date) à max (action_id) comme action_id, max (date) comme action_date et pls ne pas utiliser les mots réservés comme fieldnames - arghh –

Répondre

2

Vous êtes proche. Essayez:

SELECT * 
    FROM table_users AS users 
     LEFT JOIN (SELECT user_id, MAX(date) AS MaxDate 
         FROM table_special_actions 
         GROUP BY user_id) s_actions 
      ON s_actions.user_id = users.user_id 
     LEFT JOIN table_special_actions s2_actions 
      ON s_actions.userid = s2_actions.id 
       AND s_actions.MaxDate = s2_actions.date 
     LEFT JOIN table_actions AS actions 
      ON s2_actions.action_id = actions.id 
+0

merci, vous avez résolu un problème Il me fait des problèmes par deux jours avec une solution simple et linéaire. – vitto

+0

@vittorio: De rien. Heureux d'aider un paisan! :-) –

0

Vous avez obtenu ce résultat sans doute parce que vous avez utilisé une fonction d'agrégation (MAX) et regroupés que par la première colonne (user_id) et à gauche la deuxième colonne (action_id) sur le regroupement et l'agrégation.