MYSQL - 返回结果GROUP BY并从连接表中获取最大值

时间:2016-07-26 17:29:23

标签: mysql group-by max inner-join subset

很难获得冠军......几乎在我的绳索结束时,希望有人会帮助我。发布了类似的问题,但似乎很少涉及联合表/我在该领域的有限技能。

我有两张桌子 - 客户和面试。

- clients--
id / first_name / surname / practitioner_id / status

- interviews--
id / client_id / planned_review_date

我的目标是做一个看似简单的任务,即返回当前登录的从业者即将到来的面试日期列表。

我可以使用以下代码返回所有日期 -

        SELECT c.id, 
              c.first_name, 
               c.surname,
               i.planned_review_date,
               i.id AS IntID
        FROM clients AS c
        INNER JOIN interviews AS i
        ON c.id=i.client_id
        WHERE c.practitioner_id = 18
        AND c.status <> 'Archived' 
        ORDER BY i.id DESC

这给了我类似的东西 -

id  first_name  surname     planned_review_date     IntID 
20  Terry       Stamp       2016-04-01 00:00:00     62
20  Terry       Stamp       2016-03-01 00:00:00     61
19  Iam         More        2016-07-01 15:47:57     60
19  Iam         More        2016-08-20 00:00:00     59
10  Steve       Powers      2016-04-20 00:00:00     58
10  Steve       Powers      2015-03-20 00:00:00     57

我只需要为每位客户展示一个日期,以便他们在下一次采访时将其与

分组
GROUP BY c.id

这导致我预期的减少列表,每个客户一行。但是,实际返回的日期不是最新的日期(即与该客户端的最高i.id关联的日期)。我理解这是由于GROUP BY工作方式的限制,但我不能为我的生活让subquerys工作,以便事先对它进行排序。

id  first_name  surname        planned_review_date  IntID 
20  Terry       Stamp          2016-03-01 00:00:00  61
19  Iam         More           2016-08-20 00:00:00  59
10  Steve       Powers         2016-04-20 00:00:00  58

我需要上面的详细信息,但是Intid的62,60和58.即我需要返回的是 -

id  first_name  surname     planned_review_date     IntID 
20  Terry       Stamp       2016-04-01 00:00:00     62 
19  Iam         More        2016-07-01 15:47:57     60
10  Steve       Powers      2016-04-20 00:00:00     58

作为注释 - i.planned_review_date下的最新日期并不总是&#34;最新&#34;,我们可以假设与该客户端的最高i.id相关的日期将是相关的最新日期,因为它是最近一次面试的输入审核日期。

我知道max()但是却无法以相关客户端返回max(i.id)的方式实现它,而不是在这种情况下给我平坦的最大值 - 62。我怀疑这是子查询应该处理的关键。

我已经在这一段时间了,创造了上述更复杂的代码版本。不是我的地区继承了这个项目,但必须充分利用它。我确定在我的许多次尝试中已经接近但我不得不张贴白旗 - 有人可以帮忙吗?

编辑 - 更新,因为我有一些错误顺序的返回字段

1 个答案:

答案 0 :(得分:0)

导出一个仅包含每个客户ID的最大日期的子集,然后将其连接回您的查询:假设planned_Review_date是您正在寻找的“最新”数据。

子查询返回Client_ID和最大计划日期。通过内部连接到您的基本集,我们将该集限制为仅适用于具有该最大日期的记录。

SELECT c.id, 
       c.first_name, 
       c.surname,
       i.planned_review_date,
       i.id AS IntID
FROM clients AS c
INNER JOIN interviews AS i
  ON c.id=i.client_id
INNER JOIN (SELECT Client_ID, max(Planned_review_Date) MD 
            FROM interviews    
            GROUP BY client_ID) I2
     on I2.Client_ID = I.Client_ID 
    and I2.MD = I.Planned_Review_Date
WHERE c.practitioner_id = 18
  AND c.status <> 'Archived' 
ORDER BY i.id DESC