2012-01-18 3 views
0

Je vais avoir un peu de mysql query brain freeze. J'ai besoin de récupérer le dernier enregistrement d'une table, groupé par une deuxième colonne. Quelque chose comme ceci:rechercher les dossiers les plus récents

SELECT ca.id, ca.activity_date, cat.contact_id as cid 
FROM activity ca 
JOIN activity_target cat 
    ON ca.id = cat.activity_id 
WHERE ca.activity_type_id = 44 
GROUP BY cid 
ORDER BY activity_date DESC 

... sauf que j'ai besoin le plus récent enregistrement (en utilisant activity_date) au sein du groupe par (l'ordre est effectuée par le groupe après). J'ai essayé d'utiliser HAVING activity_date = max (activity_date) mais cela ne fonctionne pas.

+0

À quelle table appartient 'contact_id'? –

+0

J'ai modifié pour spécifier la source des champs. – lcdservices

+0

Quelle est la clé primaire de 'activity_target'? –

Répondre

1

Je pense que vous pouvez le faire comme ceci:

SELECT ca.id, ca.activity_date, cat.contact_id as cid 
FROM activity ca 
JOIN activity_target cat 
    ON ca.id = cat.activity_id 
WHERE ca.activity_type_id = 44 
    and ca.id = (SELECT id from activity a 
      join activity_target t on a.id = t.activity_id 
     WHERE t.contact_id = cat.contact_id 
     ORDER BY activity_date DESC LIMIT 1) 
ORDER BY activity_date DESC 

Je ne peux pas dire à coup sûr sans regarder votre schéma, et je devine un peu avec les différences entre MySQL et Microsoft SQL Server.

+0

C'est la corrélation qui est le problème. À moins que je ne manque quelque chose, je pense que ça me met juste dans le même trou. – lcdservices

+0

Edité avec la corrélation. – Chad

0
SELECT ca.id, ca.activity_date, cat.contact_id AS cid 
FROM activity ca 
    JOIN activity_target cat 
    ON ca.id = cat.activity_id 
    JOIN 
     (SELECT t.contact_id 
      , MAX(a.activity_date) AS activity_date 
     FROM activity a 
      JOIN activity_target t 
      ON a.id = t.activity_id 
     WHERE a.activity_type_id = 44 
     GROUP BY t.contact_id 
    ) AS grp 
    ON grp.contact_id = cat.contact_id 
    AND grp.activity_date = ca.activity_date 
WHERE ca.activity_type_id = 44 
ORDER BY ca.activity_date DESC 
Questions connexes