【问题标题】:Simple SQL problem (MySQL)简单的 SQL 问题(MySQL)
【发布时间】:2009-02-03 10:17:25
【问题描述】:

我有这个问题:

SELECT page.id, revision.title, revision.number
FROM page
    INNER JOIN revision ON page.id = revision.pageId

这将返回如下内容:

"1"   "Page Version A"   "1"
"1"   "Page Version B"   "2"
"1"   "Page Version C"   "3"

现在我只想为每一页返回一行,其中包含最新(最高编号)修订版的数据。如果我这样做:

SELECT page.id, revision.title, revision.number
FROM page
    INNER JOIN revision ON page.id = revision.pageId
GROUP BY page.id

我明白了:

"1"   "Page Version A"   "1"

但我想要:

"1"   "Page Version C"   "3"

有什么想法吗? 谢谢。

【问题讨论】:

    标签: sql mysql


    【解决方案1】:

    添加类似于

    的WHERE子句

    WHERE revision.number = (select max(number) from revision r where r.pageId = page.id)

    【讨论】:

      【解决方案2】:

      如果您只想选择一条记录,您可以使用 MySQL 'LIMIT' 关键字(类似于 MSSQL 'TOP')

      例如:

      SELECT page.id, revision.title, revision.number
      FROM page
          INNER JOIN revision ON page.id = revision.pageId
      
      ORDER BY revision.number DESC
      LIMIT 0, 1
      

      这将对所有结果进行排序,然后选择顶部的结果。

      【讨论】:

      • 这个解决方案比 Rahul 的解决方案更快!
      【解决方案3】:

      如果这是您将多次运行的查询,我会考虑创建一个视图,以选择每个 pageid 的最新修订:

      create view LatestRevision
      as 
      Select pageid, max(number) from revision
      

      那么查询将是

      SELECT page.id, revision.title, revision.number
      FROM page
          INNER JOIN revision ON page.id = revision.pageId
          INNER JOIN LatestRevision on revision.pageid = LatestRevision.pageid and revision.Number = LatestRevision.number
      

      【讨论】:

        【解决方案4】:
        SELECT page.id, MAX(revision.number)
        FROM page
        INNER JOIN revision ON page.id = revision.pageId
        GROUP BY page.id
        

        【讨论】:

        • 这只会选择最大的版本号,而不是整个最新的版本。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-01-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多