[英]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,您需要遵循以下流程: -
注意:在這里,我和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.