#mysql #sql
#mysql #sql
Вопрос:
Я пытаюсь научиться использовать SQL для извлечения определенной информации. Я использую phpMyAdmin для SQL. Вот структура:
автор (идентификатор, имя, фамилия, год рождения, пол, идентификатор LivingCityID)
книга (идентификатор, имя, Тип, год публикации, идентификатор издателя, количество проданных книг)
записывает (BookID, AuthorID)
город (идентификатор, название города, страна)
publisher (ID, PublisherName, PublisherCityID)
Вот несколько попыток получить другую информацию. Это то, как я бы это сделал?
Это позволяет получить автора, который продал больше всего книг, с указанием идентификатора автора и количества проданных книг.
SELECT w.AuthorID, MAX(b.SoldBookCount)
FROM book as b, writes as w, author as a
WHERE b.ID = w.BookID AND a.ID = w.AuthorID
Это позволяет найти пару типа автора и книги, общее количество проданных книг
которых является наибольшим, с указанием идентификатора автора, типа книги и количества проданных книг.
SELECT w.AuthorID, b.Type, MAX(b.SoldBookCount)
FROM book as b, writes as w, author as a
WHERE b.ID = w.BookID AND a.ID = w.AuthorID
Комментарии:
1. Никогда не используйте запятые в
FROM
предложении. Всегда используйте правильный, явныйJOIN
синтаксис2. Проверьте
GROUP BY
.
Ответ №1:
Это даст вам количество проданных книг для каждой пары автор / книга, используя явные JOIN
предложения. Мне нравится помещать условие соединения в ON
, а не WHERE
.
SELECT a.ID, b.ID, b.SoldBookCount
FROM author as a
JOIN writes AS w ON w.AuthorID = a.ID
JOIN book AS b ON w.BookID = b.ID
Вы можете получить общее количество книг, проданных друг для друга, используя GROUP BY
и SUM
:
SELECT a.ID, SUM(b.SoldBookCount)
FROM author as a
JOIN writes AS w ON w.AuthorID = a.ID
JOIN book AS b ON w.BookID = b.ID
GROUP BY a.ID
Наконец, вы можете получить автора с самыми продаваемыми книгами с помощью дополнительного запроса с ORDER BY
помощью и LIMIT
SELECT authorID, totalSoldCount
FROM (
SELECT a.ID as authorID, SUM(b.SoldBookCount) as totalSoldCount
FROM author as a
JOIN writes AS w ON w.AuthorID = a.ID
JOIN book AS b ON w.BookID = b.ID
GROUP BY a.ID
) as t
ORDER BY totalSoldCount DESC
LIMIT 1
Здесь доступно множество вариантов. Например, везде, где я поставил SELECT a.ID
, вы могли бы иметь SELECT w.authorID
, и это был бы тот же результат.
На самом деле, я думаю, вы можете выполнить последний запрос как один запрос:
SELECT a.ID as authorID, SUM(b.SoldBookCount) as totalSoldCount
FROM author as a
JOIN writes AS w ON w.AuthorID = a.ID
JOIN book AS b ON w.BookID = b.ID
GROUP BY a.ID
ORDER BY SUM(b.SoldBookCount) DESC
LIMIT 1
Поскольку вы специально спросили, MAX
будет выбрано максимальное значение в этом столбце, но не будет выбрана строка, имеющая это значение. Таким образом, вы можете получить максимальное количество проданных книг с помощью этого:
SELECT MAX(SoldBookCount)
FROM book
Но для того, чтобы получить идентификатор boox с наибольшим количеством продаж, вы должны сделать это (как указано выше)
SELECT ID, SoldBookCount
FROM book
ORDER BY SoldBookCount DESC
LIMIT 1
Другим вариантом было бы вычислить максимальное значение, а затем выбрать книги, в которых продано такое количество книг
SELECT ID, SoldBookCount
FROM book
WHERE SoldBookCount=MAX(SoldBookCount)
Это может быть медленнее, но имеет преимущество выбора нескольких книг, если есть привязка к первой. Вы могли бы использовать ту же идею для автора (ов) с большинством проданных книг.