2011-08-11 8 views
0

私は2つのテーブルを持っています。 Personテーブルとactivity_logテーブル集計を使用したmysqlテーブルの結合

各人には多くのアクティビティがあります。

最後のアクティビティのactivity_nameとactivity_dateを示す「人物」のリストを「選択」したいと思います。

PersonテーブルがPERSON_IDた

(すべてではない活動)、名前、電子メール

アクティビティテーブルがPERSON_IDた、ACTIVITY_ID、activity_dateは、事前にあなたの助けのための

感謝をACTIVITY_NAME。

答えて

1

サブクエリは、トリックを行う必要があります。

これは1行のみを返し、まだのは、 `INNER JOIN`のではなく、ここでは` LEFT JOIN`を試してみましょう
+0

。私は編集します。 – user583576

+0

または外活動で従業員を示さなければならない

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; 
NickHeidke

+0

はまだ最高の日付を持つ1行を返します – user583576

1

あなたのIDが自動番号が付けられていると仮定すると、あなたはこのように行うだろう:

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 

をただし、ユーザーが新しいものよりも後の過去の活動に入るかもしれないが、これは失敗し、あなたはこのように行かなければならないだろう:

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 

しかし、これはまだ問題があります:MySQLはサブクエリでLIMITを許可していませんので、同じ人が同じactivity_dateを持つ2つの活動を持っており、それが最新の日付だ場合、クエリは失敗します。