Как получить столбец в SQL, который нельзя сгруппировать по

Как получить столбец в SQL, который нельзя сгруппировать по

SQLFIDDLE: sqlfiddle.com/#!9/a83823/4

Я хочу получить первую книгу, выпущенную каждым автором в таблице. Я хочу запустить запрос, который отображает имя автора, название самой ранней книги и год ее выпуска. Я попытался использовать приведенный ниже код, но я понимаю, почему он вызывает ошибку, но не могу найти способ обойти это. Любая помощь будет оценена по достоинству!

SELECT author_fname, author_lname, title, MIN(released_year) 
 FROM BOOKS 
 GROUP BY author_fname, author_lname;

Привет и добро пожаловать. Вместо скриншота таблицы создайте минимальную рабочую демонстрацию. Например, вы можете использовать sqlfiddle.com.

ino 15.06.2018 08:04

вы можете показать нам ошибку?

Mark 15.06.2018 08:06

Я думаю, вам следует добавить столбец title также в group by и указать псевдоним для агрегированного столбца как MIN(released_year) AS released_year

Susang 15.06.2018 08:09

Привет! Спасибо за предложение @ino Вот sqlfiddle sqlfiddle.com/#!9/a83823/4

Aryan Deora 15.06.2018 08:12

Обычно вы группируете по выбранным столбцам, за исключением тех, которые являются аргументами для установки функций.

jarlh 15.06.2018 09:37

@AryanDeora, нашли ли вы подходящее решение в любом из этих 4 ответов? Если нет, расскажите подробнее. В противном случае примите решение, которое лучше всего подходит для закрытия вопроса - см. Что мне делать, когда кто-то отвечает на мой вопрос?

ino 15.06.2018 14:33
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
4
6
113
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Попробуйте с этим запросом

select * from books where (author_fname, author_lname, released_year)    
in (select author_fname, author_lname,min(released_year) as year 
from books    
group by author_fname, author_lname)  

эта проблема может быть решена с помощью функции densityrank. проверьте, помогает ли вам следующий код.

with temp as
(
Select author_fname, author_lname, title, denserank() over (partition by author_fname,author_lname order by released_year asc) as bookrank
from books
)

select author_fname, author_lname, title, released_year
from temp
where bookrank = 1
SELECT * from books 
WHERE (author_fname, author_lname, released_year) IN 
  (SELECT author_fname, author_lname, min(released_year) AS 'earliest year' 
  FROM books 
  GROUP BY author_fname, author_lname)
Ответ принят как подходящий
SELECT r.author_fname, 
  r.author_lname, r.released_year, 
  r.title
FROM
 (SELECT author_fname, author_lname, 
      MIN(released_year) AS min_year FROM books
  GROUP BY author_fname, author_lname) l
 JOIN books r
   ON r.author_fname = l.author_fname 
   AND r.author_lname = l.author_lname
   AND r.released_year = l.min_year

Должен это сделать. Обычный трюк - написать запрос, который выбирает max / min / sum из каждой группы, а затем вы выполняете соединение.

Ваш запрос

SELECT author_fname, author_lname, title, MIN(released_year) 
 FROM BOOKS 
 GROUP BY author_fname, author_lname;

на самом деле незаконно! Хотя есть опция MySQL, которая позволяет вам делать такие вещи, но обычно недопустимо выбирать столбец, который не появляется в предложении GROUP BY. Кроме того, если вы выберете столбец, который не группируется, тогда его значение по существу не определено (хотя большинство движков установят его на первое значение, которое они видят, что означает, что вы получите значение строки, которую вставили первой). В некоторых установках эта опция отключена по умолчанию, в то время как в некоторых она, кажется, включена по умолчанию, но в любом случае ... вы не должны выбирать столбец, которого нет в вашем предложении GROUP BY.

Вероятно, потому что у вас включена функция ONLY_FULL_GROUP_BY. Чтобы исправить это, вы должны отключить его.

Выполните эту команду:

mysql> УСТАНОВИТЬ ГЛОБАЛЬНЫЙ sql_mode = (ВЫБРАТЬ ЗАМЕНИТЬ (@@ sql_mode, 'ONLY_FULL_GROUP_BY', ''));

Другие вопросы по теме