#mysql #sql #aggregate-functions
#mysql #sql #агрегатные функции
Вопрос:
Вот как выглядят мои таблицы:
CREATE TABLE Author(
authorID INT PRIMARY KEY,
name VARCHAR(30)
);
CREATE TABLE book(
ISBN INT PRIMARY KEY,
title VARCHAR(30),
authorID INT,
inventory INT,
paperBack BOOLEAN,
fiction BOOLEAN,
FOREIGN KEY (authorID) REFERENCES Author(authorID)
);
Мне нужно выяснить, какой автор написал больше всего книг.
Я работаю со смесью следующего. Я думаю, у меня возникли проблемы с объединением всего этого…
SELECT authorID, count(*)
from book
group by authorID;
Я не уверен, как получить единственную строку с наибольшим количеством, а затем получить только идентификатор авторизации этой строки. Как только у меня будет этот идентификатор авторизации, я знаю, как получить имя.
Ответ №1:
Попробуйте это:
select a.name,count(*)
from author a
join book b on b.authorID=a.authorID
group by a.Name
order by 2 desc
limit 1
Комментарии:
1. Для чего используется ‘order by 2’? является ли 2 просто вторым возвращаемым значением?
2. число 2 относится ко второму столбцу в результирующем наборе
Ответ №2:
Если все, что вам нужно, это идентификатор автора, затем используйте ORDER BY
и LIMIT 1
, как указывали другие. Однако, если вам понадобятся другие поля от автора или если вас интересуют несколько авторов (второе по величине число, наименьшее количество и т. Д.), Вам следует рассмотреть возможность присоединения к производной таблице, например:
SELECT Author.*, d1.book_count
FROM Author
JOIN (SELECT authorID, count(authorID) as book_count FROM book GROUP BY authorID) d1
ON Author.authorID = d1.authorID
ORDER BY
d1.book_count
Даст результирующий набор, подобный этому:
----------------------------------
| AuthorID | Name | book_count |
----------------------------------
| 1 | bob | 20 |
| 9001 | sam | 18 |
...
Комментарии:
1. да, хотя и за счет удобства чтения. Отлично подходит для определенных ситуаций.
Ответ №3:
Вам не нужно использовать подзапрос, вы можете просто сделать что-то вроде этого:
SELECT authorID FROM book GROUP BY authorID ORDER BY COUNT(*) DESC LIMIT 1
это должно дать вам идентификатор автора с большинством книг.
Комментарии:
1. обратите внимание, что также можно вернуть имя автора напрямую, как в решении @Sparky, если это то, что вы хотите.