0

次のことを行うクエリの作成に問題があります。

連絡先を 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
4

1 に答える 1

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;
于 2012-08-07T06:53:37.790 に答える