【问题标题】:How to retrieve a column in SQL that cannot be GROUPED BY如何在 SQL 中检索不能被 GROUPED BY 的列
【发布时间】:2018-06-15 05:55:47
【问题描述】:

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
  • 你能告诉我们错误吗?
  • 我认为,您应该在group by 中也添加title 列,并将聚合列的别名命名为MIN(released_year) AS released_year
  • 嗨!感谢@ino 的建议这里是sqlfiddle sqlfiddle.com/#!9/a83823/4
  • 您通常按您选择的列进行分组,除了那些作为设置函数的参数的列。

标签: mysql sql


【解决方案1】:
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 子句中的列。 p>

【讨论】:

    【解决方案2】:
    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】:

      这个问题可以使用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
      

      【讨论】:

        【解决方案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)  
        

        【讨论】:

          【解决方案5】:

          这可能是因为您启用了 ONLY_FULL_GROUP_BY 功能。要解决此问题,您必须禁用它。

          运行这个命令:

          mysql > SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

          【讨论】:

            猜你喜欢
            • 2016-09-08
            • 2019-11-06
            • 2013-06-08
            • 2021-04-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多