【问题标题】:How to include only the last match in an SQL query如何在 SQL 查询中仅包含最后一个匹配项
【发布时间】:2014-10-03 03:34:54
【问题描述】:

我有一个数据库,其中包含以一对多关系与每个用户相关的用户和注释。

我想做一个查询,返回用户的详细信息,包括关于他们的最后注释。

为了说明这里的数据示例:

因此,对于用户 David,结果中包含的注释应该是 note.id=6,例如对于 John note.id=3。

SELECT user.firstname, 
       user.lastname, 
       note.note 
LEFT JOIN note
ON note.userID = user.id 

我可以向此 SQL 查询添加什么以仅包含每个用户最后添加的注释?

【问题讨论】:

标签: mysql sql


【解决方案1】:

从可用的MAX(id) 添加where 子句和select

WHERE note.id = ( SELECT MAX(id) FROM note)

编辑:

SELECT user.firstname, 
       user.lastname, 
       note.notes 
FROM user
LEFT JOIN note ON note.userid = user.id
WHERE note.id = ( SELECT MAX(id) FROM note
                  WHERE note.userid = user.id)
OR note.userid IS NULL --EDIT

【讨论】:

  • 我刚试过,它只返回有多个笔记的用户。不会返回数据库中只有一个注释或没有注释的用户。你知道我怎么能解决这个问题吗?谢谢
  • 尝试在其中添加一个 where 。 (...from note where note.userid = user.id)
  • @user2721465 它有效,我刚刚编辑了我的帖子。这是小提琴sqlfiddle.com/#!2/1e0e9/7/0
  • 对不起,是的,我把它添加到了错误的地方。非常感谢
  • 啊,该死的......对不起,只是仔细检查了一下,它仍然省略了用户没有注释的行。我还需要它来显示没有任何笔记的用户。 (在小提琴中,如果您删除 Tim 注释,它不会输出他的数据)
【解决方案2】:
SELECT firstname, lastname, note
FROM user u
LEFT JOIN (SELECT *
           FROM note
           ORDER BY id DESC) n
ON u.id = n.userid
GROUP BY u.id

【讨论】:

  • 选择未在 GROUP BY 子句中列出的列在标准 SQL 中无效。虽然 MySQL 允许您这样做,但“选择的值是不确定的。此外,每个组中的值选择不会受到添加 ORDER BY 子句的影响”dev.mysql.com/doc/refman/5.0/en/group-by-extensions.html
  • 你的意思不是说解决方案是正确的吗?
  • 不,它没有,它为user 返回一个随机的note,如文档所述。在这个特定示例中,随机音符恰好是最后一个音符并不意味着它总是如此。
  • sqlfiddle.com/#!2/0e6ae3/1 新测试..按预期工作...你能给我看一个返回错误值的查询示例吗?否则我似乎找不到错误。
  • 不,我不能。但我假设编写我引用的页面的 MySQL 开发人员可以。
猜你喜欢
  • 2017-09-09
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 2020-06-04
  • 1970-01-01
  • 1970-01-01
  • 2020-12-01
  • 2013-11-18
相关资源
最近更新 更多