如何在SQL中检索不能为GROUPED BY的列

时间:2018-06-15 05:55:48

标签: mysql sql

enter image description here

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

我想检索表中每位作者发布的第一本书。我想运行一个查询,显示作者的姓名,最早的书的标题和发布的年份。我尝试使用下面的代码,但我可以看到它导致错误的原因,但我无法找到解决方法。任何帮助将不胜感激!

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

5 个答案:

答案 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',''));