次のことを行うクエリの作成に問題があります。
連絡先を 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