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

标签 mysql group-by max inner-join subset

很难命名……我几乎已经束手无策了,希望有人能帮助我。有类似的问题发布,但似乎很少涉及连接表/我在这方面的技能有限。

我有 2 张 table - 客户和采访。

--客户--
id/名字/姓氏/从业者_id/状态

--采访--
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 工作方式的限制,但我一生都无法让子查询工作以预先对其进行排序。

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 下的最新日期并不总是“最新”,我们可以假设与该客户的最高 i.id 相关的日期将是相关的最新日期,因为它是输入审核日期在最近一次采访中。

我了解 max(),但无法以返回关联客户端的 max(i.id) 的方式实现它,而不是在本例中给我平坦的 max - 62。我怀疑这是子查询应该处理的关键。

我已经在这方面工作了一段时间,创建了上述代码的更复杂的代码版本。不是我的领域继承了这个项目,但必须充分利用它。我确信我在很多很多次尝试中都已经很接近了,但我不得不举起白旗 - 有人可以帮忙吗?

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

最佳答案

派生一个仅包含每个客户端 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

关于MYSQL - 返回结果 GROUP BY 并从连接表中获取最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38596372/

相关文章:

php - 获取两个连续的日期,它们之间的时间最长

mysql - 过滤重复项后选择具有唯一值的行

具有最大长度的mysql聚合

javascript - 如何在哈希数组中找到最新的日期并返回对应的名称键/值

math - 有 n 个节点的有向图中的最大边数是多少?

php - 从日期值为 xxxx-xx-xx 的 sql 值中选择年份

mysql - 您可以 GROUP_CONCAT IF SELECT 语句的结果吗

python sqlite3 查询.db文件的表名和列名

postgresql - 为什么索引中列的顺序对 Postgresql 中的分组很重要?

mysql - SQL 查询 : multiple count group by date