我无法构建查询来执行以下操作:
按activity_type_id过滤联系人,仅显示最近活动具有所需activity_type_id或为NULL(无活动)的联系人
表的结构如下:
联系人可以有许多不同类型的活动
activity:
id
contact_id
activity_type_id
date
contact:
id
first_name
last_name
到目前为止,我有这个:
SELECT * FROM (
SELECT c.first_name, c.last_name, a.activity_type_id, MAX(a.date) AS maxdate
FROM contact AS c
LEFT JOIN activity AS a ON a.contact_id = c.id
GROUP BY c.id
ORDER BY c.first_name ASC
) AS act
然后将其添加到过滤器:
WHERE activity_type_id = 3 /* <- I would like to filter using this */
但是,对于有多项活动的联系人,我收到了错误的activity_type_id。
我最终希望将它用作Doctrine 1.2查询,但我喜欢先在MySQL中使用它。
三江源。
最终解决方案
SELECT c.first_name, c.last_name, a.activity_type_id FROM contact c
LEFT JOIN
(SELECT a1.contact_id, a1.date, a1.activity_type_id FROM activity a1
JOIN (SELECT contact_id, MAX(DATE) DATE FROM activity GROUP BY contact_id) a2
ON a1.contact_id = a2.contact_id AND a1.date = a2.date
) a
ON c.id = a.contact_id
WHERE a.activity_type_id = 2;
最终可以调整原因以返回各种活动类型或设置为IS NULL。
DQL 1.2兼容版
SELECT * FROM contact c
LEFT JOIN activity ON c.id = contact_id
WHERE ROW (c.id,DATE) IN (SELECT contact_id, MAX(date) date FROM activity GROUP BY contact_id)
AND activity_type_id = 2
答案 0 :(得分:1)
尝试此查询 -
编辑:添加a1.activity_type_id
SELECT c.first_name, c.last_name FROM contacts c
LEFT JOIN
(SELECT a1.contact_id, a1.date, a1.activity_type_id FROM activity a1
JOIN (SELECT contact_id, MAX(date) date FROM activity GROUP BY contact_id) a2
ON a1.contact_id = a2.contact_id AND a1.date = a2.date
) a
ON c.contact_id = a.contact_id
WHERE a.contact_id IS NULL OR a.activity_type_id = 3;