【问题标题】:In mysql, how to join with second table and get row having most recent date?在 mysql 中,如何加入第二个表并获取具有最新日期的行?
【发布时间】:2017-09-01 23:11:17
【问题描述】:

在 mysql 中,我有两个表:QuestionCommentary。这就是他们的样子:

问题:ID、标题

评论:QuestionId、Content、Created(日期字段)

QuestionId 是问题 ID 的外键。

所以我在问题和评论之间有 0 对多的关系。也就是说,一个问题可以有 0..n 条评论。

我想做的是显示所有问题以及最新的评论(如果有的话)(创建字段)。因此,如果没有评论,问题仍然必须显示,但评论的内容字段中为 null。

我相信我几乎可以在这个查询中使用它,除了它只检索 cmets 的问题。如前所述,我也想要没有 cmets 的问题。

select 
    q.Id AS Id,
    q.Title AS Title,
    c.Content AS Content
from question AS q
left join commentary as c on c.QuestionId = q.Id
where
   c.Created = (
      select MAX(created)
      from commentary
      where questionid = q.Id
    )

如何调整脚本?

【问题讨论】:

  • @Barmar:我认为您使用“复制按钮”有点快。我不相信这是您链接到的问题的重复。当我们花时间在 stackoverflow 上输入问题时,您至少可以在将问题标记为重复之前通读一遍!
  • 我认为这是重复的。只需将 c.created = (...)WHERE 子句移动到 ON 子句,它应该可以工作。
  • 另见this question。它展示了如何编写一个查询来获取每个问题的最新评论,您可以使用该查询离开联接。
  • @Barmar:但尽管解决方案可能相似,但问题仍然不是重复的。
  • @Barmar:但无论如何感谢您的帮助。

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


【解决方案1】:

where 子句仅返回注释行具有最大创建日期的行,当没有注释记录时,该日期不正确。您只需要包含评论 question_ID 为 null 的行,当没有评论时应该始终为 true。

select 
    q.Id AS Id,
    q.Title AS Title,
    c.Content AS Content
from question AS q
     left join commentary as c on c.QuestionId = q.Id
where
   c.Created = (
      select MAX(created)
      from commentary
      where questionid = q.Id
   )
   or
   c.QuestionId is null

【讨论】:

    猜你喜欢
    • 2015-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多