【问题标题】:Mysql - 'Select max' from multiple joined tables doesn't return correct valuesMysql - 从多个连接表中的“选择最大值”不返回正确的值
【发布时间】:2019-09-19 14:52:40
【问题描述】:

我有两张表 - 一张是地址列表,另一张是出席日期和 EmployeeIDNumbers 以识别出席的工程师。一位工程师可能多次参加过一个地址。我正在尝试选择地址名称,以及最近的出勤日期和相应的工程师ID

select s.sitename, max(sd.scheduleddate), sd.EngineerID
from sites as s 
left join scheduled_dates as sd on sd.idsites = s.idsites
group by s.idsites

此代码正确提取每个地址和最近的“预定日期”,但未提取正确的相应工程师 ID。如何从与 max(scheduleddate) 相同的行获取engineerID?认为这与 'greatest-n-per-group' 讨论有关,但我看不出如何使用已经有连接的查询来实现该代码

【问题讨论】:

  • 请在您的问题中添加创建表和数据以及您的 mysql 编号。它通常适用于 min 和 max

标签: mysql sql greatest-n-per-group


【解决方案1】:

您可以将NOT EXISTS 条件与相关子查询一起使用:

select s.sitename, sd.EngineerID, sd.scheduleddate
from sites as s 
inner join scheduled_dates as sd on sd.idsites = s.idsites
where not exists (
    select 1
    from scheduled_dates sd1
    where sd1.idsites = s.idsites
    and sd1.scheduleddate > sd.scheduleddate
)

该条件确保scheduled_dates 中不存在与当前站点日期大于所选记录日期的其他记录。

注意:我将您的 LEFT JOIN 转为 INNER JOIN,因为我相信它更适合您的用例,如果需要,请随时恢复。

【讨论】:

  • 知道了,感谢您的及时回复。我曾尝试 +1 您的答案,但由于是新手,我不能。现在来看看内连接和左连接之间的区别。再次感谢
【解决方案2】:

在 MySQL 8+ 中,您可以使用窗口函数:

select s.sitename, sd.scheduleddate, sd.EngineerID
from sites s left join
     (select sd.*,
             row_number() over (partition by sd.idsites orer by sd.scheduleddate desc) as seqnum
      from scheduled_dates sd
     ) sd
     on sd.idsites = s.idsites and sd.seqnum = 1;

请注意,这也会保留所有网站(这似乎是您的意图),即使是那些尚未访问过的网站。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-21
    • 1970-01-01
    • 2013-10-20
    • 1970-01-01
    • 2018-10-29
    • 2019-10-22
    • 2021-09-28
    • 2020-05-28
    相关资源
    最近更新 更多