MySQL 5.1.7两个表的条​​件连接,从第二个表中选择按日期排列的最高记录,从第一个表中选择所有记录

时间:2014-04-28 02:05:58

标签: mysql sql

我有两张桌子:

  • 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

3 个答案:

答案 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

检查Sql Fiddle

答案 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方法,无论我如何选择,总是返回奇数结果;

谢谢大家对此的帮助,非常感谢。