Zanim ktoś zapyta, tak, jest to część pracy domowej, jednak próbowałem i szukałem podobnych rozwiązań, ale żaden z nich nie zadziałał.Jak wybrać całą krotkę, która ma wartość MAX z podzapytania?
Należy również zauważyć, że powinien on działać na serwerze MySQL, więc należy wziąć pod uwagę każdą specjalną składnię.
Do tego trzeba będzie cztery tabele:
person (idperson INT, firstName VARCHAR(45))
beer (idbeer INT, name VARCHAR(45))
purchase(idpurchase INT, idperson INT)
beerxpurchase(idpurchase INT, idbeer INT, quantity INT)
Gdzie każdy z pierwszych kolumn jest klucz podstawowy wyjątkiem beerxpurchase
, który jest kluczowym złożonej z pierwszej i drugiej kolumnie, a wszystkie inne kolumny, które mają wspólne nazwy, reprezentują klucz obcy.
Na koniec muszę utworzyć zapytanie, które zwróci każdą osobę o identyfikatorze piwa, które kupił najwięcej we wszystkich zakupach, oraz o łącznej kwocie tego rodzaju piwa, które kupili.
Zapytanie takie jak:
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;
zwróci całkowitą ilość piwa zakupionego dla każdego konkretnego kodu piwa na osobę, mniej więcej tak:
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
To, co uważam dobry początek, jednak z tego zapytania powinienem dostać tylko krotkę, która ma maksymalną ilość na użytkownika. Brzmi jak GROUP BY NAME
jednak działa coś takiego:
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;
straci poprawną piwny identyfikator, ale będzie utrzymywać prawidłową nazwę osoby, a całkowitą ilość piwa kupić, coś takiego:
FIRST_NAME ID_BEER TOTAL_BOUGHT
A 1 23
B 1 11
D 1 10
E 1 10
C 3 5
Z tego, co przeczytałem, większość DBMS nie śledzi ID_BEER, ponieważ nie jest częścią GRUPY (o ile zrozumiałem). Jednak zmiana ostatniej grupy na GROUP BY preference.FIRST_NAME, preference.ID_BEER
zwróci te same krotki z wewnętrznego podzapytania.
Pytanie brzmi: z tego podzapytania, jak można przejść do uzyskania całej krotki powiązanej z tą określoną maksymalną wartością? W przypadku, gdy możesz zaproponować lepsze rozwiązanie dla podzapytania lub zapytania w ogóle, jest to więcej niż mile widziane.
Wszystko, co nie jest do końca jasne lub potrzebujesz więcej informacji o stołach i ich związkach, proszę dać mi znać.
To jest w stylu podobnym do odpowiedzi @Mahedi Sabuj, ponieważ używa sprzężenia tego samego podkwerendy, nie? Poza tym, twój też działa, a ty nawet włączyłeś nazwę piwa, jak miło z twojej strony. – Vicyorus
Tak - teraz widzę, że druga odpowiedź miała po prostu kilka błędów - ja, chociaż twierdzę, że moja jest bardziej czytelna ;-) – Strawberry
Nic nie usłyszę ode mnie. – Vicyorus