Выберите строку со значением столбца Max: удалось вернуть правильный ответ, но в поисках более чистой реализации - PullRequest
0 голосов
/ 24 октября 2018

У меня есть две таблицы book(isbn, title, authorID, genre, pubYear, publisher, rrPrice, avgRating) и orderDetails(oNo, bookISBN, quantity).Есть несколько заказов с их собственными OrderDetails, поэтому каждая книга может иметь несколько OrderDetails, связанных с их собственным количеством.Мне нужно найти книги, которые имеют наибольшее количество заказов.Мне удалось получить правильный вывод, но мое решение довольно грязное, включающее использование одного и того же подзапроса дважды, и мне было интересно, кто-нибудь может предложить более чистую реализацию?Ответ, который я придумал, ниже:

SELECT title, pubYear, orderSum
FROM
(
SELECT title, pubYear,orderSum
FROM 
(
SELECT title, pubYear,SUM(quantity) AS orderSum
FROM book INNER JOIN orderDetails ON bookISBN = isbn
GROUP BY title, pubYear) T
GROUP BY title, pubYear) S
WHERE S.orderSum = (select max(S.orderSum) from (SELECT title, 
pubYear,orderSum
FROM 
(
SELECT title, pubYear,SUM(quantity) AS orderSum
FROM book INNER JOIN orderDetails ON bookISBN = isbn
GROUP BY title, pubYear) T
GROUP BY title, pubYear) S);

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Так я бы решил проблему.

SELECT b.title, b.pubYear, Count (o.bIsbn) AS NumberOforders ИЗ книг AS b ВНУТРЕННЕЕ СОЕДИНЕНИЕ OrderDetails как o ON b.bIsbn = o.bIsbn GROUP BY b.title, b.pubYear ORDERПо номеру заказа DESC

0 голосов
/ 24 октября 2018

"Самая простая" форма будет использовать оконные функции - но они доступны только в MySQL 8 +.

В более старых версиях вы можете сформулировать это как:

SELECT b.title, b.pubYear, SUM(od.quantity) AS orderSum
FROM book b INNER JOIN
     orderDetails od
     ON od.bookISBN = b.isbn
GROUP BY b.title, b.pubYear, b.isbn
HAVING SUM(od.quantity) = (SELECT SUM(od2.quantity)
                           FROM orderDetails od2
                           WHERE od2.isbn = b.isbn
                           ORDER BY SUM(od2.quantity DESC)
                          );
...