我有两张桌子:
instructions
- 每个人的唯一记录events
- 每个人的多条记录;记录有各种类型我需要检索竞争的指令列表,并为每个指令检索具有最大(最新)日期的'appointment'
事件。
我已尝试使用group by
,但未能获得正确的结果。
instructions
表:
id first_name surname telephone
---- ------------ --------- -----------
1 bob marley 555-1234
2 steve pike 555-3456
3 daniel osborne 555-9876
4 mark hodge 555-6600
5 stefan belfant 555-8080
events
表:
id instruction_id type commment event_date
----- ---------------- ------------ --------- ------------
1 1 create na 2013-11-18
2 2 call na 2013-11-19
3 2 appointment onsite 2013-12-02
4 3 create na 2013-09-17
5 3 appointment office 2013-09-17
6 3 finalize as discuss 2013-11-19
7 4 create na 2013-12-02
8 4 cancel na 2013-12-02
9 5 create na 2013-10-02
10 1 appointment at home 2013-11-22
11 2 appointment at home 2013-12-05
所需的输出:
id first_name surname telephone appointment comment
---- ------------ --------- ----------- ------------- ---------
1 bob marley 555-1234 2013-11-22 at home
2 steve pike 555-3456 2013-12-05 at home
3 daniel osborne 555-9876 2013-09-17 office
4 mark hodge 555-6600
5 stefan belfant 555-6060
答案 0 :(得分:0)
假设任何特定人的最新/最大约会日期是唯一的,您可以写:
SELECT instructions.*,
latest_events.event_date AS appointment,
latest_events.comment
FROM instructions
LEFT
OUTER
JOIN ( SELECT events.instruction_id,
MAX(events.event_date) AS latest_event_date
FROM events
WHERE events.type = 'appointment'
GROUP
BY events.instruction_id
) latest_event_dates
ON instructions.id = latest_event_dates.instruction_id
LEFT
OUTER
JOIN events latest_events
ON latest_event_dates.instruction_id = latest_events.instruction_id
AND latest_event_dates.latest_event_date = latest_events.event_date
AND 'appointment' = latest_events.type
;
(如果最新/最长约会日期不唯一,那么您需要在联接中添加另一个步骤,您可以在其中选择MIN(events.id)
或{{1对于给定的MAX(events.id)
和events.instruction_id
,或者诸如此类的东西。)
答案 1 :(得分:0)
试试这个
SELECT I.id,
I.first_name,
I.surname,
I.telephone,
E.event_date,
E.comment
FROM instructions I
LEFT JOIN
(SELECT *
FROM
(SELECT *
FROM EVENTS
WHERE EVENTS.type='appointment'
ORDER BY EVENTS.event_date DESC) EVENTS
GROUP BY EVENTS.type,
EVENTS.instruction_id ) E ON I.id=E.instruction_id
答案 2 :(得分:0)
最终解决方案来自为我工作的一名工作人员......它快速闪电,确切地说是需要的:
SELECT i.id,ins.type,ins.event_date 来自说明我 左连接说明我 on ins.id =(选择inss.id 来自事件inss 在哪里inss.instruction_id = i.id AND inss.type ='约会' ORDER BY inss.event_date DESC 限制1 );
Group By方法,无论我如何选择,总是返回奇数结果;
谢谢大家对此的帮助,非常感谢。