2009-08-23 60 views
0

我真的很难找出这一个。由MySQL混乱组

我有一个表“备注”:

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_id 5002评论作为记录与最小评论编号..我甚至尝试插入新记录,cmt_id 5002总是作为MIN而不是记录与cmt_id 5001.

回答

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工作,在查询其合并离开不是一行分钟cmt_id但随机的行(或最后一个,但我不会指望它)。在上面的查询中,它会首先找到所有的min id,然后为它们中的每一个获取扩展信息。

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 

就足够了。如果你需要额外的字段,你需要使用子查询作为其他答案。

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 
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 ...)

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

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