MySQL乱七八糟的集团

时间:2009-08-23 14:10:16

标签: sql mysql database group-by

我真的很难解决这个问题。

我有一张表'评论':

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.

我现在想要在EACH线程中获得最小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_id 5002作为具有最小评论ID的记录获取评论。我甚至尝试插入新记录,cmt_id 5002始终为MIN,而不是cmt_id 5001的记录。

4 个答案:

答案 0 :(得分: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但是随机的(或者最后一行,但我不会指望它)。在上面的查询中,它首先会找到所有的min ID,然后获得每个min ID的扩展信息。

答案 1 :(得分:1)

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

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

如果不是

,则应该无法指定SELECT列
  1. GROUP BY
  2. 汇总功能(例如MINMAXCOUNTSUM ...)
  3. 在你的情况下,我会使用这个选择

    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 
    

答案 2 :(得分:0)

这可能只是一个错字,但您输入的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

就足够了。如果您需要其他字段,则需要根据其他答案使用子查询。

答案 3 :(得分:0)

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