2012-06-27 16 views
1

我有这两个表SQL与两个连接的表进行排序

people 
============ 
id, name 

answer_sheets 
============ 
id, person_id, answer, date_answered 
  • person_id是people.id

外键现在,我想要做的是根据最新的排序(我们可以得出一个people行可以有很多answer_sheets行)

比方说我们有表

people 
============ 
id name 
1 Person1 
2 Person2 
3 Person3 
4 Person4 
5 Person5 


answer_sheets 
============= 
id person_id answer date_answered 
1 1   string JUN 13 
2 2   string JUN 15 
3 3   string JUN 17 
4 2   string JUN 18 
5 1   string JUN 19 
6 3   string JUN 20 
7 2   string JUN 25 

,我想根据people行的answer_sheets.date_answered

ASC以订购 people

输出必须是

============= 
id name  last_date_answered 
4 Person4 NIL 
5 Person5 NIL 
1 Person1 JUN 19 
3 Person3 JUN 20 
2 Person2 JUN 25 

您可以观察到peopleid的第4和5个没有answer_sheet,但它们应该包含在列表中。 问题:什么是适当的SQL查询?谢谢。

回答

4

要获取记录即使没有匹配,也可以使用LEFT JOIN

SELECT p.id, p.name, MAX(a.date_answered) 
FROM people p 
LEFT JOIN answer_sheets a on p.id = a.personID 
GROUP BY p.id, p.name 
ORDER BY MAX(date_answered) ASC 

而且,如果你想尝试一下,或者用它越玩,我做了一个SQLFiddle ...

1
SELECT 
    people.id, 
    people.name, 
    baseview.last_date_answered 
FROM (
    SELECT 
    person_id, 
    MAX(date_answered) AS last_date_answered 
    FROM answer_sheets 
    ORDER BY IFNULL(MAX(date_answered),'0001-01-01') 
) AS baseview 
    INNER JOIN people ON bseview.person_id=people.id 
0

SELECT * 
FROM people 
     CROSS APPLY (SELECT MAX(date_answered) MaxDate 
         FROM  answer_sheets 
         WHERE  answer_sheets.PersonID = people.ID 
        ) L