2011-08-11 3 views
0

J'ai 2 tables. Person tableau et activity_log tableautable mysql rejoindre avec des agrégats

Il existe de nombreuses activités pour chaque personne.

Je voudrais "sélectionner" une liste de "personnes" montrant le nom de l'activité et le date de l'activité de leur dernière activité. (pas toutes les activités)

Table personne a person_id, nom, email

Table d'activité a person_id, activity_id, activity_date, ACTIVITY_NAME

Merci pour votre aide à l'avance.

Répondre

1

Un sous-requête devrait faire l'affaire:

SELECT p.person_id, p.name, p.email, a.activity_id, a.activity_date, a.activity_name 
FROM Person p 
LEFT JOIN Activity a 
ON p.person_id = a.person_id 
WHERE a.activity_date = (SELECT MAX(a1.activity_date) 
       FROM activity a1 
       WHERE a.person_id = a1.person_id 
       GROUP BY person_id) OR activity_date IS NULL; 
+0

Ce ne retourne que 1 rang et doit montrer encore employés ou des activités – user583576

+0

Essayons 'gauche JOIN' ici plutôt que d'un' INNER JOIN'. Je vais éditer. – NickHeidke

+0

retourne toujours seulement 1 ligne avec la date la plus élevée – user583576

1

En supposant que vos identifiants sont numérotés automatiquement, vous feriez comme ceci:

SELECT pe.person_id, 
     pe.name, 
     al.activity_name, 
     al.activity_date 
FROM person pe 
     LEFT JOIN (SELECT p.person_id, 
         Max(a.activity_id) activity_id 
        FROM person p 
         LEFT JOIN activity_log a 
          ON (p.person_id = a.person_id) 
        GROUP BY p.person_id) AS LAST 
     ON pe.person_id = LAST.person_id 
     LEFT JOIN activity_log al 
     ON LAST.activity_id = al.activity_id 

Cependant, les utilisateurs peuvent saisir des activités passées au plus tard les nouvelles, cela échouera et vous auriez à aller comme ça :

SELECT LAST.person_id, 
     LAST.name, 
     LAST.activity_date, 
     (SELECT activity_name 
     FROM activity_log al 
     WHERE al.person_id = LAST.person_id 
       AND al.activity_date = LAST.activity_date) activity_name 
FROM (SELECT p.person_id, 
       Max(p.name)   AS name, 
       Max(a.activity_date) activity_date 
     FROM person p 
       LEFT JOIN activity_log a 
       ON (p.person_id = a.person_id) 
     GROUP BY p.person_id) AS LAST 

Mais cela a encore un problème: depuis MySQL ne permet pas LIMIT dans les sous-requêtes, la requête échouera si la même personne a deux activités avec le même activity_date et c'est la date la plus.