2016-01-12 3 views
0

У меня есть этот SQL-запрос, чтобы узнать, сколько раз снимались книги определенной категории.Лучшие значения из таблицы

SELECT Category.name, COUNT(*) AS "times rented" 
FROM Category 
INNER JOIN Book ON Book.category=Category.name 
INNER JOIN Rent ON Rent.book_id=Book.id 
GROUP BY Category.name 
ORDER BY COUNT(*) DESC 
LIMIT 1 

Теперь это будет работать отлично, если я захочу получить самую популярную книгу. Проблема заключается в «LIMIT 1». У меня есть несколько книг, которые были арендованы столько же раз, сколько и результат запроса выше. Удаление «LIMIT 1» просто возвращает все арендованные категории.

Скажем выше запрос возвращает этот

name | times rented 
Adventure 153 
Comics 153 
Biography 102 
Romance 80 

Как я вернусь как «Приключение» и «Комиксы»?

ответ

1

Вы можете использовать MAX().

SELECT Category.name, COUNT(*) times_rented 
FROM Category 
INNER JOIN Book ON Book.category=Category.name 
INNER JOIN Rent ON Rent.book_id=Book.id 
INNER JOIN (select MAX(COUNT(*)) max_count FROM Category GROUP BY Category.name) t ON t.id = Category.id AND Category.times_rented = t.max_count 
GROUP BY Category.name 
1

вы можете использовать максимум графа для сравнения, и заменить " с backticks в times rented, чтобы использовать его в качестве псевдонима без предупреждений.

SELECT Category.name, COUNT(*) AS `times rented` 
FROM Category 
INNER JOIN Book ON Book.category=Category.name 
INNER JOIN Rent ON Rent.book_id=Book.id 
GROUP BY Category.name 
having `times rented` = (select MAX(cnt) from 
(select COUNT(*) as cnt FROM Category GROUP BY Category.name) temp 
) 
+0

Это связано с ошибкой # 1111 - Недопустимое использование групповой функции – j2235686

+0

Извините, что я обновляю ответ. –

+0

Таким образом, ошибка исчезла, но результат - противоположное, чего я пытаюсь достичь здесь. Вместо самых популярных категорий он возвращает наименее популярный. – j2235686

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