2011-10-14 3 views
0

Вот что мои таблицы выглядит следующим образом:Казалось бы, простой MYSQL запрос

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; 

Я не уверен, как получить одну строку, которая имеет наибольшее количество, а затем только получить AuthorID из этой строки. Как только у меня есть этот authorID, я знаю, как получить имя.

ответ

1

Если все, что вы хотите, это идентификатор автора, а затем использовать 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   | 

... 
+0

да, хотя ценой удобочитаемости. Отлично подходит для определенных ситуаций. –

1

Вам не нужно использовать подзапрос, вы можете просто сделать что-то вроде этого:

SELECT authorID FROM book GROUP BY authorID ORDER BY COUNT(*) DESC LIMIT 1

это должно дать вам AuthorID автора с большинства книг.

+0

Высокий. Спасибо! – PFranchise

+0

Обратите внимание, что также можно вернуть имя автора напрямую, как в решении @Sparky, если это то, что вы хотите. –

2

Попробуйте это:

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 
+0

Что такое «порядок на 2»? это 2 только второе возвращаемое значение? – PFranchise

+0

номер 2 относится ко второй колонке в результирующем наборе – Sparky

Смежные вопросы