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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

如何選擇每個(gè)類別最新的四項(xiàng)?

如何選擇每個(gè)類別最新的四項(xiàng)?

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

3 回答

?
湖上湖

TA貢獻(xiàn)2003條經(jīng)驗(yàn) 獲得超2個(gè)贊

這是每個(gè)組中最大的n個(gè)問(wèn)題,這是一個(gè)非常常見(jiàn)的SQL問(wèn)題。

下面是我如何用外部連接來(lái)解決這個(gè)問(wèn)題:

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,這是一個(gè)單調(diào)遞增的偽鍵。也就是說(shuō),在item_id中的較新行對(duì)應(yīng)。item.

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

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


另一個(gè)可行但依賴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引入了對(duì)SQL標(biāo)準(zhǔn)窗口函數(shù)的支持?,F(xiàn)在,我們可以像其他RDBMS那樣解決這類問(wèn)題:

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;


查看完整回答
反對(duì) 回復(fù) 2019-06-19
?
慕姐4208626

TA貢獻(xiàn)1852條經(jīng)驗(yàn) 獲得超7個(gè)贊

在其他數(shù)據(jù)庫(kù)中,可以使用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ù),但是您可以使用變量來(lái)模擬它:

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。
  • 對(duì)于我們看到的每一行,檢查類別_id是否與前一行相同。
    • 如果是,增加行號(hào)。
    • 否則,啟動(dòng)一個(gè)新類別并將行號(hào)重置為1。
  • 子查詢完成后,最后一步是過(guò)濾,以便只保留行號(hào)小于或等于4的行。


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

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

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