第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何選擇每個類別最新的四項?

如何選擇每個類別最新的四項?

大話西游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個贊

這是每個組中最大的n個問題,這是一個非常常見的SQL問題。

下面是我如何用外部連接來解決這個問題:

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;

我假設(shè)item表是item_id,這是一個單調(diào)遞增的偽鍵。也就是說,在item_id中的較新行對應。item.

下面是它的工作原理:對于每一項,都有一些更新的其他項目。例如,有三個項目比第四個最新項目更新。有零個項目比最新的項目更新。所以我們想比較每個項目(i1)到一組項目(i2)是更新的,并且具有與i1..如果這些新產(chǎn)品的數(shù)量少于四個,i1就是其中之一。否則,不要包括它。

這個解決方案的美妙之處在于,不管您有多少類別,它都能工作,如果您更改了類別,它將繼續(xù)工作。即使某些類別中的項目數(shù)少于4個,它也能工作。


另一個可行但依賴MySQL用戶變量特性的解決方案:

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;

MySQL 8.0.3引入了對SQL標準窗口函數(shù)的支持。現(xiàn)在,我們可以像其他RDBMS那樣解決這類問題:

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;


查看完整回答
反對 回復 2019-06-19
?
慕姐4208626

TA貢獻1852條經(jīng)驗 獲得超7個贊

在其他數(shù)據(jù)庫中,可以使用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

不幸的是,MySQL不支持ROW_NUMBER函數(shù),但是您可以使用變量來模擬它:

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

看到它在網(wǎng)上工作:木琴

它的工作如下:

  • intially@prev設(shè)置為null,@rn設(shè)置為0。
  • 對于我們看到的每一行,檢查類別_id是否與前一行相同。
    • 如果是,增加行號。
    • 否則,啟動一個新類別并將行號重置為1。
  • 子查詢完成后,最后一步是過濾,以便只保留行號小于或等于4的行。


查看完整回答
反對 回復 2019-06-19
  • 3 回答
  • 0 關(guān)注
  • 600 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號