這是一個產品表,有幾百萬條記錄。
SELECT查詢返回每個組的1行
我想列出記錄如下:
通常我使用:
SELECT id,
product_name,
store_id
FROM product
GROUP BY store_id
ORDER BY id.
目前有SQL性能問題。我需要SQL查詢來輸出這樣的結果。
這是一個產品表,有幾百萬條記錄。
SELECT查詢返回每個組的1行
我想列出記錄如下:
通常我使用:
SELECT id,
product_name,
store_id
FROM product
GROUP BY store_id
ORDER BY id.
目前有SQL性能問題。我需要SQL查詢來輸出這樣的結果。
有許多替代解決這一點,我建議是加入了一個子查詢,其分別獲取最新ID
(假設列AUTO_INCREMENT
版)每個store_ID
。
SELECT a.*
FROM tableName a
INNER JOIN
(
SELECT store_ID, MAX(ID) max_ID
FROM tableName
GROUP BY store_ID
) b ON a.store_ID = b.store_ID AND
a.ID = b.max_ID
有更好的表現,一定要對這些列的索引:ID
和store_id
。
更新1
,如果你想爲每一個記錄的限制,使用下面這個,
SELECT ID, product_Name, store_ID
FROM tableName a
WHERE
(
SELECT COUNT(*)
FROM tableName b
WHERE b.store_ID = a.store_ID AND b.ID >= a.ID
) <= 2;
好。是工作!我可以限制每個store_id的2條記錄嗎? –
太好了。但是,我可以對ID DESC進行排序嗎? –
當然,看看這個鏈接,http://www.sqlfiddle.com/#!2/ba920/12 –
試試這個請:
SELECT * FROM YOURTABLE B
JOIN (SELECT MAX(ID) MX FROM YOURTABLE GROUP BY STORE_ID) A
ON A.STORE_ID = B.STORE_ID
AND B.ID = A.MX
GROUP BY B.STORE_ID
;
SELECT store_id,id,product_name FROM table_name
WHERE id IN (SELECT MAX(id) FROM table_name GROUP BY store_id)
ORDER BY id
這應該工作,你可以根據你的要求按store_id或id來定購。
@ J-W:這與接受的答案(語法除外)有何不同?在這兩種情況下,結果似乎都是正確的。 – Priednis
請將表格結構和explain語句的輸出作爲問題的一部分,以便我們可以看到WHY查詢如此之慢。確保在表格定義中包含索引。 – Namphibian
在查詢中提及您的表名「from product」 –