我必須爲每個主題選擇最後兩條記錄。如何選擇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
我怎樣才能做到這一點?
感謝
我必須爲每個主題選擇最後兩條記錄。如何選擇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
我怎樣才能做到這一點?
感謝
你可以
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是沒有漏洞的上升,則可以進一步改進查詢。
我想知道更好的答案,但以下查詢將起作用。
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
實際上它不會(在第二個子查詢中存在缺少g的錯誤,尋找roup),但更重要的是 - mysql不保證組中未包含的列的值來自最後一條記錄,並且可以自由返回它選擇的任何值(或換句話說,如果您的查詢返回了期望的結果,那麼根據定義它只是巧合,它可能會在任何給定時刻停止工作) – Unreason 2010-04-08 14:37:25
解決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
讓我知道如何爲你工作。
使用此查詢,我在「錯誤列」中找到錯誤「Unknown column'a.topic_id' where子句'「 – rayne 2017-04-10 07:26:35
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
有沒有我們可以假設的捷徑?例如在上面的數據中,你的id是沒有漏洞的升序,對於升序的id,你也有上升的topic_id - 如果我們可以假設它會使查詢更容易。另一種方法可以使用假設每個topic_id至少有兩個條目。我們可以假設嗎? – Unreason 2010-04-08 10:36:05