我真的很难解决这个问题。
我有一张表'评论':
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的记录。
答案 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列GROUP BY
列MIN
,MAX
,COUNT
,SUM
...)在你的情况下,我会使用这个选择
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