Казалось бы, простой запрос MYSQL

#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, если это то, что вы хотите.