【问题标题】:LIMIT one row per ID (MySQL) [duplicate]每个 ID 限制一行(MySQL)[重复]
【发布时间】:2013-02-25 07:05:06
【问题描述】:

我在 MySQL 查询中加入了几个表,它们通过员工 ID 号链接。

ID 号在表 A 和 B 中是唯一的,但在表 C 中有多行,每个条目的日期(存储为字符串)是唯一的。

我需要确定表 C 中每个员工 ID 号的最近日期,并将表 C 中的每个 ID 号限制为一个条目(显然是最近的)。

我不确定如何将每个员工 ID 号的 LIMIT 设置为 1。

感谢您的帮助。

【问题讨论】:

  • the manual to the rescue!(是的,我承认很难找到)。
  • 我查看了手册,没有看到在另一个字段中为每个实例声明一行的方法。我只是想知道这里是否缺少其他功能。
  • 不是在 MySQL 中没有(我相信 PostreSQL 中有一个),真的,我指向你的链接有/就是答案(放弃你的limit,这已经通过其他方式得到保证)。
  • 我明白了,链接是否指向特定页面?因为我点击它时找不到页面。
  • 啊,该死,确实坏了:here's one I meant,我很抱歉!

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


【解决方案1】:

下面的查询使用子查询来获取tableC上每个EmployeeID的每个最近日期

SELECT  a.*, b.*, c.*
FROM    tableA a
        INNER JOIN tableB b 
            ON a.EmployeeID = b.EmployeeID
        INNER JOIN tableC c
            ON a.EmployeeID = c.EmployeeID
        INNER JOIN
        (
            SELECT  EmployeeID, MAX(date) max_date
            FROM    tableC
            GROUP   BY  EmployeeID
        ) d ON  c.EmployeeID = d.EmployeeID AND
                c.Date = d.max_date

【讨论】:

  • 感谢您的回复。在阅读了上面的 Wrikkens 文章链接之后,我能够在我的 WHERE 子句中添加一个子查询。不过,我使用了 LEFT JOIN 而不是 INNER JOIN。
【解决方案2】:

根据我对您问题的理解:

select a.*, b.*, max(c.date) from A
     inner join B on A.id=B.id
     inner join C on A.id=C.id
     group by A.id

这将按 A 的 ID 对记录进行分组。也就是说,您将在响应中为 A 中的每一行获得一行(因为它们由该 ID 唯一标识)。 B 也会发生同样的事情,因为它们具有相同的 ID。然后,在 C 中,A 中的每条记录都有多个记录,因此将它们分组并获取日期的最大值将只返回每个 A 的 C 日期(每种情况下的最大值)。

【讨论】:

  • 我在这里遵循您的逻辑,但是通过声明 max(c.date) 不会只返回整个字段中的单个最大日期吗?还是不是这样,因为它是按 a.id 分组的?我认为无论哪种方式都不好测试。
  • 它将返回最大日期,并且由于您按 A.id 分组,因此将返回该特定 A.id 的最大日期(据我所知,这是您要查找的)
猜你喜欢
  • 2014-03-12
  • 2017-08-28
  • 1970-01-01
  • 2017-06-26
  • 2018-05-18
  • 2018-12-27
  • 2015-10-05
  • 2016-12-13
  • 1970-01-01
相关资源
最近更新 更多