大話西游666
2019-06-19 16:18:57
如何選擇每個類別最新的四項?我有一個物品數(shù)據(jù)庫。每個項目都由類別表中的類別ID分類。我試圖創(chuàng)建一個頁面,列出每個類別,并在每個類別下顯示該類別中的4個最新項目。例如:寵物用品img1
img2
img3
img4寵物食品img1
img2
img3
img4我知道,通過查詢每個類別的數(shù)據(jù)庫,我可以輕松地解決這個問題,如下所示:SELECT id FROM category然后遍歷該數(shù)據(jù)并查詢數(shù)據(jù)庫中的每個類別,以獲取最新的項:SELECT image FROM item where category_id = :category_id
ORDER BY date_listed DESC LIMIT 4我想弄清楚的是,我是否可以使用1查詢并獲取所有這些數(shù)據(jù)。我有33個類別,所以我想它可能有助于減少調(diào)用數(shù)據(jù)庫的次數(shù)。有人知道這是否可能嗎?或者,如果33個電話沒什么大不了的話,我應該用簡單的方式來做。
3 回答

湖上湖
TA貢獻2003條經(jīng)驗 獲得超2個贊
SELECT i1.*FROM item i1LEFT OUTER JOIN item i2 ON (i1.category_id = i2.category_id AND i1.item_id < i2.item_id)GROUP BY i1. item_idHAVING COUNT(*) < 4ORDER BY category_id, date_listed;
item
item_id
item_id
item
.
i1
i2
i1
i1
SELECT *FROM ( SELECT i.*, @r := IF(@g = category_id, @r+1, 1) AS rownum, @g := category_id FROM (@g:=null, @r:=0) AS _init CROSS JOIN item i ORDER BY i.category_id, i.date_listed) AS tWHERE t.rownum <= 3;
WITH numbered_item AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY category_id ORDER BY item_id) AS rownum FROM item)SELECT * FROM numbered_item WHERE rownum <= 4;

慕姐4208626
TA貢獻1852條經(jīng)驗 獲得超7個贊
ROW_NUMBER
SELECT category_id, image, date_listedFROM( SELECT category_id, image, date_listed, ROW_NUMBER() OVER (PARTITION BY category_id ORDER BY date_listed DESC) AS rn FROM item) AS T1WHERE rn <= 4
ROW_NUMBER
SELECT category_id, image, date_listedFROM( SELECT category_id, image, date_listed, @rn := IF(@prev = category_id, @rn + 1, 1) AS rn, @prev := category_id FROM item JOIN (SELECT @prev := NULL, @rn = 0) AS vars ORDER BY category_id, date_listed DESC) AS T1WHERE rn <= 4
intially@prev設(shè)置為null,@rn設(shè)置為0。 對于我們看到的每一行,檢查類別_id是否與前一行相同。 如果是,增加行號。 否則,啟動一個新類別并將行號重置為1。 子查詢完成后,最后一步是過濾,以便只保留行號小于或等于4的行。
添加回答
舉報
0/150
提交
取消