SQLFIDDLE: sqlfiddle.com/#!9/a83823/4
Я хочу получить первую книгу, выпущенную каждым автором в таблице. Я хочу запустить запрос, который отображает имя автора, название самой ранней книги и год ее выпуска. Я попытался использовать приведенный ниже код, но я понимаю, почему он вызывает ошибку, но не могу найти способ обойти это. Любая помощь будет оценена по достоинству!
SELECT author_fname, author_lname, title, MIN(released_year)
FROM BOOKS
GROUP BY author_fname, author_lname;
вы можете показать нам ошибку?
Я думаю, вам следует добавить столбец title также в group by и указать псевдоним для агрегированного столбца как MIN(released_year) AS released_year
Привет! Спасибо за предложение @ino Вот sqlfiddle sqlfiddle.com/#!9/a83823/4
Обычно вы группируете по выбранным столбцам, за исключением тех, которые являются аргументами для установки функций.
@AryanDeora, нашли ли вы подходящее решение в любом из этих 4 ответов? Если нет, расскажите подробнее. В противном случае примите решение, которое лучше всего подходит для закрытия вопроса - см. Что мне делать, когда кто-то отвечает на мой вопрос?






Попробуйте с этим запросом
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', ''));
Привет и добро пожаловать. Вместо скриншота таблицы создайте минимальную рабочую демонстрацию. Например, вы можете использовать sqlfiddle.com.