【问题标题】:Group by MySQL mess按 MySQL 混乱分组
【发布时间】:2009-08-23 14:10:15
【问题描述】:

我真的很难弄清楚这一点。

我有一个表格“评论”:

cmt_id (primary key, auto incr), thread_id, cmt_text

我有这些记录:

cmt_id   thread_id       cmt_txt
5002     1251035762511   Alright, I second this. 
5003     1251036148894   Yet another comment.
5001     1251035762511   I am starting a thread on this.

我现在想,在每个线程中获得最少的cmt_id 记录。所以,我用这种方式做了一个聚合查询:

SELECT cmt_id, thread_id, cmt_text, MIN(cmt_id) FROM comments 
GROUP BY thread_id;

但是,我最终得到了这个:

cmt_id   thread_id    cmt_text                    MIN(cmt_id)
5002    1251035762511   Alright, I second this.     5001
5003    1251036148894   Yet another comment.        5003

对于带有thread_id“1251035762511”的线程,我总是收到带有cmt_id5002 的评论作为具有最小评论ID 的记录。我什至尝试插入新记录,cmt_id5002 总是以 MIN 和不是cmt_id 5001 的记录。

【问题讨论】:

    标签: sql mysql database group-by


    【解决方案1】:

    你必须有以下几行:

    SELECT 
       cmt_id, 
       thread_id, 
       cmt_text 
    FROM comments 
    WHERE cmt_id IN (
             SELECT 
                MIN(cmt_id) 
             FROM comments 
             GROUP BY thread_id);
    

    这就是 SQL 的工作方式,在您的查询中,它合并的行不是带有 min cmt_id 的行,而是随机的行(或最后一个,但我不会指望它)。在上面的查询中,它会首先找到所有的最小 id,然后获取每个最小 id 的扩展信息。

    【讨论】:

      【解决方案2】:

      我不知道为什么 MySQL 允许你这样做,但通常在 SQL 中以下查询是无效的

      SELECT cmt_id, thread_id, cmt_text, MIN(cmt_id) FROM comments 
      GROUP BY thread_id;
      

      如果不是,您不应该指定 SELECT 列

      1. GROUP BY 专栏
      2. 聚合函数(例如MINMAXCOUNTSUM...)

      在你的情况下,我会使用这个选择

      SELECT cmt_id, thread_id, cmt_text FROM comments INNER JOIN (
        SELECT MAX(cmt_id) AS cmt_id FROM comments 
        GROUP BY thread_id
      ) a ON a.cmt_id = comments.cmt_id 
      

      【讨论】:

        【解决方案3】:
        SELECT *
        FROM comments
             INNER JOIN (
               SELECT cmt_id = MIN(cmt_id), thread_id
               FROM comments
               GROUP BY thread_id
             ) cmin ON cmin.cmt_id = comments.cmt_id
        

        【讨论】:

          【解决方案4】:

          这可能只是一个错字,但您输入的 SQL 查询实际上有 MIN(cmt_id) 而不是 MAX(cmt_id)。

          SELECT cmt_id, thread_id, cmt_text, MIN(cmt_id) FROM comments 
          GROUP BY thread_id;
          

          我认为您可能需要在显示器旁边放一个rubber duck 并与它交谈

          如果您只想要最大评论 ID,那么

          SELECT MAX(cmt_id), thread_id FROM comments GROUP BY thread_id
          

          就足够了。如果您需要其他字段,则需要按照此处的其他答案使用子查询。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-01-16
            • 1970-01-01
            • 2016-09-04
            • 1970-01-01
            相关资源
            最近更新 更多