簡體   English   中英

如何從子查詢中選擇具有MAX值的整個元組?

[英]How to select the entire tuple that has the MAX value from a subquery?

在有人要求之前,是的,這是作業的一部分,但是,我已經嘗試並搜索了類似的解決方案,但沒有一個有效。

同樣重要的是要注意這應該在MySQL服務器上運行,因此應該考慮它們的任何特殊語法。

為此,您需要四個表:

person (idperson INT, firstName VARCHAR(45))
beer (idbeer INT, name VARCHAR(45))
purchase(idpurchase INT, idperson INT)
beerxpurchase(idpurchase INT, idbeer INT, quantity INT)

其中每個第一列是主鍵,但beerxpurchase除外,它是第一列和第二列的組合鍵,共享名稱的所有其他列表示外鍵。

最后,我需要進行一個查詢,返回每個人的所有購買中他們購買的啤酒的ID,以及他們購買的那種啤酒的總量。

查詢如下:

SELECT person.firstName NAME, beerxpurchase.idBeer BEER, SUM(beerxpurchase.quantity) TOTAL
FROM person

INNER JOIN purchase
on person.idperson = purchase.idperson

INNER JOIN beerxpurchase
ON beerxpurchase.idpurchase = purchase.idpurchase

GROUP BY person.firstName, beerxpurchase.idbeer;

將返回為每個人的每個特定啤酒代碼購買的啤酒總量,如下所示:

NAME   BEER    TOTAL
A      1       5
A      2       23
A      3       3
A      4       19
A      5       7
B      1       11
B      2       3
B      3       3
B      4       4
B      5       5
C      3       5
D      1       8
D      2       4
D      4       1
D      5       10
E      1       9
E      4       10

這是我認為是一個良好的開端,但是,從該查詢中我應該只得到每個用戶具有最大數量的元組。 聽起來像GROUP BY NAME ,但運行如下:

SELECT preferenence.FIRST_NAME, preferenence.ID_BEER, MAX(preferenence.TOTAL_BOUGHT) FROM
(
    SELECT person.firstName FIRST_NAME, beerxpurchase.idBeer ID_BEER, SUM(beerxpurchase.quantity) TOTAL_BOUGHT
    FROM person

    INNER JOIN purchase
    on person.idperson = purchase.idperson

    INNER JOIN beerxpurchase
    ON beerxpurchase.idpurchase = purchase.idpurchase

    GROUP BY person.firstName, beerxpurchase.idbeer
) preferenence

GROUP BY preferenence.FIRST_NAME
ORDER BY MAX(preferenence.TOTAL_BOUGHT) DESC;

將丟失正確的啤酒ID,但會保留正確的人名和購買的啤酒總量,如下所示:

FIRST_NAME     ID_BEER      TOTAL_BOUGHT
A              1            23
B              1            11
D              1            10
E              1            10
C              3            5

根據我的閱讀,大多數DBMS都不會跟蹤ID_BEER,因為它不屬於GROUP(據我所知)。 但是,將最后一個GROUP更改為GROUP BY preference.FIRST_NAME, preference.ID_BEER將從內部子查詢返回相同的元組。

所以問題是:從那個子查詢中,如何繼續將整個元組與特定的最大值相關聯? 或者,如果您可以為子查詢或查詢提出更好的解決方案,那么非常歡迎。

任何不完全清楚的事情,或者如果您需要有關表格及其關系的更多信息,請告訴我。

要獲得一個人購買啤酒最多的beer_id,您需要遵循以下流程: -

  1. 查找一個人購買的每個類別的啤酒總數(已經完成)
  2. 從一個人那里查找這些類別的最大啤酒數量(僅計數不是beer_id)
  3. 加入1&2的結果與計數和人

注意:在這里,我和idperson因為不同的人可以有相同的firstName

這是完整的查詢: -

SELECT person.firstname, personBeer.idbeer, personPurchase.TOTAL_BOUGHT
FROM
(
   SELECT purchaseInfo.idperson, MAX(purchaseInfo.TOTAL_BOUGHT) TOTAL_BOUGHT
   FROM
   (
      SELECT purchase.idperson, beerxpurchase.idbeer, 
           SUM(beerxpurchase.quantity) TOTAL_BOUGHT
      FROM purchase
      INNER JOIN beerxpurchase ON beerxpurchase.idpurchase = purchase.idpurchase
      GROUP by purchase.idperson, beerxpurchase.idbeer
   ) purchaseInfo
   GROUP BY purchaseInfo.idperson
) personPurchase
INNER JOIN person ON person.idperson = personPurchase.idperson
INNER JOIN 
(
    SELECT purchase.idperson, beerxpurchase.idbeer, 
        SUM(beerxpurchase.quantity) TOTAL_BOUGHT
    FROM purchase
    INNER JOIN beerxpurchase ON beerxpurchase.idpurchase = purchase.idpurchase
    GROUP by purchase.idperson, beerxpurchase.idbeer  
) personBeer 
ON personBeer.TOTAL_BOUGHT  = personPurchase.TOTAL_BOUGHT 
    AND personBeer.idperson = person.idperson
ORDER BY personPurchase.TOTAL_BOUGHT DESC

希望它能幫到你。

SELECT p.firstName
     , b.name beer
     , m.total
  FROM 
     ( SELECT o.idperson
            , bo.idbeer
            , SUM(bo.quantity) total
         FROM beerxpurchase bo 
         JOIN purchase o 
           ON o.idpurchase = bo.idpurchase 
        GROUP
           BY o.idperson
            , bo.idbeer
     ) m
  JOIN 
     ( SELECT idperson
            , MAX(total) total
         FROM 
            ( SELECT o.idperson
                   , bo.idbeer
                   , SUM(bo.quantity) total
                FROM beerxpurchase bo 
                JOIN purchase o 
                  ON o.idpurchase = bo.idpurchase 
               GROUP
                  BY o.idperson
                   , bo.idbeer
            ) x
        GROUP
           BY idperson
     ) n
    ON n.idperson = m.idperson
   AND n.total = m.total
  JOIN person p
    ON p.idperson = m.idperson
  JOIN beer b
    ON b.idbeer = m.idbeer

http://sqlfiddle.com/#!9/c6bb9/15

我知道你沒有要求啤酒的名稱,但我個人傾向於按名稱而不是ID來訂購啤酒。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM