2009-08-23 59 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