Как мне написать запрос, чтобы выбрать верхние и нижние 3 значения из 2 таблиц, используя один запрос?

#mysql #sql

#mysql #sql

Вопрос:

Реляционная база данных содержит 2 таблицы: книги и авторы, каждая из которых содержит более 1 миллиона строк.

Таблицы описываются следующим образом: Книги (название, проданные копии), где Название — это первичный ключ Авторы (Автор, название), где Название относится к книгам

Напишите ОДИН запрос, который показывает, что 3 лучших автора и 3 нижних автора основаны на количестве проданных копий.

Я пытаюсь решить эту проблему, однако у меня ничего не вышло.

 select *  
from authors a 
left  join books b on a.authortitle = b.title 
order by b.sold;
  

когда я попробовал это, это ответ, который я получаю.

 select *  
from authors a 
left  join books b on a.authortitle = b.title 
order by b.sold 
group by author;
  

ОШИБКА 1064 (42000): у вас ошибка в синтаксисе SQL; проверьте
руководство, соответствующее вашей версии сервера MySQL, чтобы найти правильный
синтаксис для использования рядом с ‘group by author’ в строке 1

Я не уверен, что это значит. Кто-нибудь знает, как решить эту проблему? Спасибо!

Комментарии:

1. какую версию mysql вы используете?

2. показать образец данных !!! это обязательно!!

3. Считается ли продажа 0 копий «наименьшим»?

Ответ №1:

Вы можете использовать оператор ОБЪЕДИНЕНИЯ. Что-то вроде этого (этот код не проверен: D )

 (select * from authors a left join books b on a.authortitle = b.title order by b.sold limit 3)
union
(select * from authors aa left join books bb on aa.authortitle = bb.title order by bb.sold desc limit 3)
  

Ответ №2:

 select a.*,
rank() over(partition by a.author order by b.copiessold asc) rk  
from authors a 
left  join books b on a.authortitle = b.title 
where rk<4
UNION ALL
select a.*,
rank() over(partition by a.author order by b.copiessold desc) rk  
from authors a 
left  join books b on a.authortitle = b.title 
where rk<4;
  

Комментарии:

1. @DylanSee если это решило вашу проблему, поставьте зеленую галочку слева!!!!