【问题标题】:MySQL LIMIT on a LEFT JOINMySQL LIMIT 上的 LEFT JOIN
【发布时间】:2009-10-15 23:30:47
【问题描述】:

我的查询:

   SELECT issues.*, 
          comments.author AS commentauthor, 
          comments.when_posted AS commentposted
     FROM issues
LEFT JOIN (SELECT * 
             FROM comments 
         ORDER BY when_posted DESC 
            LIMIT 1) AS comments ON issues.id=comments.issue
ORDER BY IFNULL(commentposted, issues.when_opened) DESC

我的问题是第三行的“LIMIT 1”。这将所有 cmets 限制为只有最新的,因此只有最新评论的问题才会被报告为有评论。

如果我从那里删除“LIMIT 1”部分,我会为问题中的每条评论得到一行,这不是我想要的。我想要的只是每个问题的最新评论。

无论如何,我不确定我的 IFNULL 部分是否有效,因为这还不是我调试的地方。

那么我将如何实现我想要的呢?

【问题讨论】:

  • rexem - 您对我的 SQL 代码的编辑...左边的间距看起来很奇怪:c
  • 反正比以前好多了。

标签: sql mysql


【解决方案1】:

试试:

   SELECT i.*,
          c.author AS commentauthor,
          c.when_posted AS commentposted
     FROM ISSUES i
LEFT JOIN COMMENTS c ON c.issue = i.id
     JOIN (SELECT c.issue,
                  MAX(c.when_posted) 'max_when_posted'
             FROM COMMENTS c
         GROUP BY c.issue) mwp ON mwp.issue = c.issue
                              AND mwp.max_when_posted = c.when_posted
 ORDER BY COALESCE(c.when_posted, i.when_opened) DESC

【讨论】:

  • 这行得通,但我的数据库中有一个问题,没有任何关联的 cmets,它没有被列出。无论如何,所有这些答案都有些……令人困惑。我有很多东西要学... ._.
【解决方案2】:
   SELECT issues.*, 
          comments.author AS commentauthor, 
          comments.when_posted AS commentposted
     FROM issues
LEFT JOIN ( SELECT c1.issue, c1.author, c1.when_posted
              FROM comments c1
           JOIN
           (SELECT c2.issue, max(c2.when_posted) AS max_when_posted           
              FROM comments c2
          GROUP BY issue) c3
            on c1.issue = c3.issue and c1.when_posted = c3.max_when_posted
          ) AS comments ON issues.id=comments.issue
 ORDER BY COALESCE(commentposted, issues.when_opened) DESC

【讨论】:

  • 警告:mysql_fetch_array():提供的参数不是有效的 MySQL 结果资源。哦,亲爱的。
  • 你有没有直接在MySql中测试过查询(如果有的话至少要有sql错误信息)。 php 错误可能意味着很多事情。
  • phpMyAdmin 说“#1052 - 字段列表中的列‘问题’不明确”
  • 然后我们有“#1054 - '字段列表'中的未知列'cmets.author'”。到底什么是“字段列表”?
  • 已修复。字段列表是一个选择输出的列(字段)(即:在 SELECT 和 FROM 之间)
【解决方案3】:

编辑

由于MySql毕竟没有CTE,试试这个:

SELECT i.*
    c.author AS CommentAuthor,
    c.when_posted AS CommentPosted
FROM Issues i
LEFT JOIN 
    (SELECT issue, MAX(when_posted) AS LastPostDate 
     FROM comments GROUP BY issue) ic ON ic.issue = i.id
LEFT JOIN Comment c ON c.issue = i.id AND c.when_posted = ic.LastPostDate  
ORDER BY COALESCE(ic.LastPostDate, issues.when_opened) DESC

【讨论】:

  • 遗憾的是,MySQL 不支持 WITH 子句。该请求自 2006 年以来一直存在 :(
猜你喜欢
  • 2017-04-25
  • 1970-01-01
  • 2021-02-05
  • 1970-01-01
  • 1970-01-01
  • 2014-03-16
  • 2012-05-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多