首页 > 数据库 > mysql教程 > 为什么我的 SQL 查询抛出'列必须出现在 GROUP BY 子句中或在聚合函数中使用”错误?

为什么我的 SQL 查询抛出'列必须出现在 GROUP BY 子句中或在聚合函数中使用”错误?

Susan Sarandon
发布: 2025-01-18 13:52:09
原创
395 人浏览过

Why Does My SQL Query Throw a

解决“必须出现在 GROUP BY 子句中或在聚合函数中使用”SQL 错误

当查询对数据进行分组(使用 GROUP BY)但选择不参与分组的列时,会出现 SQL 错误“列“makerar.wmname”必须出现在 GROUP BY 子句中或在聚合函数中使用”。 SQL 要求任何不在 GROUP BY 子句中的选定列必须聚合(例如,使用 MAXMINAVGSUMCOUNT)或省略。

解决方案:

以下是解决此问题的几种方法:

  1. wmname 子句中包含 GROUP BY

    如果您需要与每个唯一 wmname 关联的所有 cname 值,这是最简单的解决方案。

    <code class="language-sql">SELECT cname, wmname, MAX(avg)
    FROM makerar
    GROUP BY cname, wmname;</code>
    登录后复制
  2. 最大值子查询和 JOIN:

    当您只需要与每个 wmname 的最大 avg 相对应的 cname 时,此方法很有用。

    <code class="language-sql">SELECT m.cname, m.wmname, t.mx
    FROM (
        SELECT cname, MAX(avg) AS mx
        FROM makerar
        GROUP BY cname
    ) t
    JOIN makerar m ON m.cname = t.cname AND m.avg = t.mx;</code>
    登录后复制

    这首先查找子查询中每个 avg 的最大值 cname。然后,它将这个结果连接回原始表以检索相应的 wmname.

  3. 窗口函数(如果支持):

    如果您的数据库系统支持窗口函数(大多数现代系统都支持),这提供了一个简洁高效的解决方案。

    <code class="language-sql">SELECT cname, wmname, MAX(avg) OVER (PARTITION BY cname) AS mx
    FROM makerar;</code>
    登录后复制

    窗口函数计算每个 avg 分区的最大值 cname,而不改变原始行结构。 如果您只想要独特的结果,您可能需要 DISTINCT

通过实现其中一种方法,您将正确检索每个 avg 的最大平均值 (cname),同时适当处理 wmname 列,从而消除 SQL 错误。 选择最适合您的特定数据要求和数据库功能的解决方案。

以上是为什么我的 SQL 查询抛出'列必须出现在 GROUP BY 子句中或在聚合函数中使用”错误?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板