2010-04-07 136 views
9

我必須爲每個主題選擇最後兩條記錄。如何選擇MySQL中每個topic_id的最後兩條記錄

例如: 表:味精

id | topic_id 
------------ 
1 | 1 
2 | 1 
3 | 1 
4 | 1 
5 | 2 
6 | 2 
7 | 2 
8 | 3 
9 | 3 
10 | 3 

我想獲得這些行:

3 1 
4 1 
6 2 
7 2 
9 3 
10 3 

我怎樣才能做到這一點?

感謝

+0

有沒有我們可以假設的捷徑?例如在上面的數據中,你的id是沒有漏洞的升序,對於升序的id,你也有上升的topic_id - 如果我們可以假設它會使查詢更容易。另一種方法可以使用假設每個topic_id至少有兩個條目。我們可以假設嗎? – Unreason 2010-04-08 10:36:05

回答

1

你可以

SELECT a.id, a.topic_id 
FROM MSG a 
WHERE a.id IN (
    SELECT t.id 
    FROM MSG t 
    WHERE a.topic_id = t.topic_id 
    ORDER BY t.id DESC 
    LIMIT 2) 
ORDER BY a.topic_id, a.id 

編輯: ,因爲它似乎是MySQL不允許(!但它會在未來的版本中是可能的)子查詢中使用LIMIT這裏是一個廣義解(有沒有捷徑的假設,但msg.id每topic_id唯一的):

SELECT a.id, a.topic_id 
FROM MSG a 
WHERE a.id IN (
    SELECT MAX(t.id) 
    FROM MSG t 
    WHERE a.topic_id = t.topic_id 
      ) OR 
     a.id IN (
    SELECT MAX(t.id) 
    FROM MSG t 
    WHERE a.topic_id = t.topic_id AND 
    t.id NOT IN (
     SELECT MAX(t2.id) 
     FROM MSG t2 
     WHERE t.topic_id = t2.topic_id 
       ) 
      )  
ORDER BY a.topic_id, a.id 
當然

這是不是很好,但也沒辦法。如果假定topic_id中的id是沒有漏洞的上升,則可以進一步改進查詢。

+0

它給了我以下錯誤「MySQL尚不支持」限制& IN/ALL/ANY/SOME子查詢'「 – Salil 2010-04-08 09:54:05

+0

答案更新,以彌補我不知道的MySQL限制。 – Unreason 2010-04-08 11:39:52

0

我想知道更好的答案,但以下查詢將起作用。

SELECT * FROM msg where id in (SELECT m.id FROM msg m group by topic_id) 
      or id in (SELECT m1.id FROM msg m1 where id not in (SELECT m2.id FROM msg m2 roup by topic_id) 
group by topic_id) order by id 
+0

實際上它不會(在第二個子查詢中存在缺少g的錯誤,尋找roup),但更重要的是 - mysql不保證組中未包含的列的值來自最後一條記錄,並且可以自由返回它選擇的任何值(或換句話說,如果您的查詢返回了期望的結果,那麼根據定義它只是巧合,它可能會在任何給定時刻停止工作) – Unreason 2010-04-08 14:37:25

3

解決SQL不支持限制條件後跟IN子句很簡單。只需在您的IN子句中構建另一個子查詢。舉個例子。

SELECT a.id, a.topic_id 
FROM MSG a 
WHERE a.id IN (
    SELECT t.id 
    FROM (Select * from MSG t 
    WHERE a.topic_id = t.topic_id 
    ORDER BY t.id DESC 
    LIMIT 2)alias) 
ORDER BY a.topic_id, a.id 

讓我知道如何爲你工作。

+0

使用此查詢,我在「錯誤列」中找到錯誤「Unknown column'a.topic_id' where子句'「 – rayne 2017-04-10 07:26:35

3
SELECT max(id), max(topic_id) FROM msg 
GROUP BY topic_id 

UNION 

SELECT max(id), max(topic_id) FROM msg 
WHERE id not in (
    SELECT max(id) as id FROM msg 
    GROUP BY topic_id) 
GROUP BY topic_id 
相關問題