SQLFIDDLE:sqlfiddle.com /#!9 / a83823 / 4
我想检索表中每位作者发布的第一本书。我想运行一个查询,显示作者的姓名,最早的书的标题和发布的年份。我尝试使用下面的代码,但我可以看到它导致错误的原因,但我无法找到解决方法。任何帮助将不胜感激!
SELECT author_fname, author_lname, title, MIN(released_year)
FROM BOOKS
GROUP BY author_fname, author_lname;
答案 0 :(得分:0)
尝试使用此查询
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)
答案 1 :(得分:0)
使用denserank函数可以解决这个问题。检查以下代码是否对您有所帮助。
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
答案 2 :(得分:0)
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)
答案 3 :(得分:0)
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
应该这样做。通常的技巧是编写一个查询,从每个组中选择最大/最小/总和,然后执行连接。
您的查询
SELECT author_fname, author_lname, title, MIN(released_year)
FROM BOOKS
GROUP BY author_fname, author_lname;
实际上是非法的!虽然有一个MySQL选项可以让你做这种事情,但通常选择一个没有出现在GROUP BY
子句中的列是无效的。此外,如果您确实选择了一个您没有分组的列,那么它的值基本上是未定义的(尽管大多数引擎会将其设置为它们看到的第一个值,这意味着您将获得首先插入的行的值)。某些安装默认情况下禁用此选项,而有些安装似乎默认启用它但无论如何...... 您不应该选择未出现在GROUP BY子句中的列。
答案 4 :(得分:0)
可能是因为您启用了ONLY_FULL_GROUP_BY功能。要解决此问题,必须禁用它。
运行此命令:
mysql> SET GLOBAL sql_mode =(SELECT REPLACE(@@ sql_mode,'ONLY_FULL_GROUP_BY',''));