【问题标题】:In aggregated query without GROUP BY, expression #1 of SELECT list contains nonaggregated column 'jquzntys.posts.id'在没有 GROUP BY 的聚合查询中,SELECT 列表的表达式 #1 包含非聚合列“jquzntys.posts.id”
【发布时间】:2020-03-17 15:53:03
【问题描述】:

我正在尝试按状态计算帖子。但是下面的查询给了我这个错误。

错误消息:[42000][1140] 在没有 GROUP BY 的聚合查询中, SELECT 列表的表达式 #1 包含非聚合列 'jquzntys.posts.id';这与 sql_mode=only_full_group_by

SELECT COUNT(p.id)  total,
       p1.authors   authors,
       p2.published published,
       p3.pending   pending,
       p4.scheduled scheduled,
       p5.draft     draft,
       p6.deleted   deleted
FROM posts p
         LEFT JOIN (
    SELECT id, COUNT(*) as `authors`
    FROM posts
    WHERE user_id = ?
) AS p1 ON p1.id = p.id
         LEFT JOIN (
    SELECT id, COUNT(*) as `published`
    FROM posts
    WHERE status = ?
) AS p2 ON p2.id = p.id
         LEFT JOIN (
    SELECT id, COUNT(*) as `pending`
    FROM posts
    WHERE status = ?
) AS p3 ON p3.id = p.id
         LEFT JOIN (
    SELECT id, COUNT(*) as `scheduled`
    FROM posts
    WHERE status = ?
) AS p4 ON p4.id = p.id
         LEFT JOIN (
    SELECT id, COUNT(*) as `draft`
    FROM posts
    WHERE status = ?
) AS p5 ON p5.id = p.id
         LEFT JOIN (
    SELECT id, COUNT(*) as `deleted`
    FROM posts
    WHERE status = ?
) AS p6 ON p6.id = p.id

没有需要分组的数据。为什么我会收到此错误?

【问题讨论】:

  • 因为和sql_mode=only_full_group_by不兼容。
  • count() 是一个聚合函数。 id 列既不分组也不聚合
  • 样本数据和期望的结果会有所帮助。

标签: mysql sql


【解决方案1】:

如果您使用COUNT() 但未指定GROUP BY 子句,它仍然符合聚合查询的条件,但整个结果被视为一个“组”。您可能认为您没有任何分组,因为您没有 GROUP BY 子句,但它隐含在您使用 COUNT() 中。

您似乎想计算每个状态的帖子数,并显示(任何状态的)帖子总数,还显示特定用户的帖子数。

我建议这样做,使用两个单独的查询:

SELECT COUNT(*) as count
FROM posts
WHERE user_id = ?;

SELECT status, COUNT(*) as count
FROM posts
GROUP BY status WITH ROLLUP;

第二个查询的好处是,如果以后出现任何新的状态值,你不必重写查询。 WITH ROLLUP 为您提供结果集最后一行的总数(在该行上,status 将为 NULL)。

并非每个任务都需要在单个 SQL 查询中实现。有时将查询拆分为两个查询可以让两个查询更简单、更清晰。

【讨论】:

    【解决方案2】:

    嗯。 . .这对我有效并且有意义:

    SELECT p.id, COUNT(*) as num_posts,
           p1.authors   authors,
           p2.published published,
           p3.pending   pending,
           p4.scheduled scheduled,
           p5.draft     draft,
           p6.deleted   deleted
    FROM posts p . . .
    GROUP BY p.id, p1.authors, p2.published, p3.pending, p4.scheduled, p5.draft, p6.deleted
    

    但是,我想我会像您对其他聚合一样包含聚合:

    SELECT p.id, p.num_posts,
           p1.authors   authors,
           p2.published published,
           p3.pending   pending,
           p4.scheduled scheduled,
           p5.draft     draft,
           p6.deleted   deleted
    FROM (SELECT p.id, COUNT(*) as cnt
          FROM posts p
          GROUP BY p.id
         ) p LEFT JOIN
         . . .
    

    话虽如此,这似乎很奇怪。 idposts 中不是唯一的吗?

    编辑:

    或者,我认为这可能是您真正想要的:

    SELECT COUNT(*) as num_posts,
           SUM(p1.authors) as authors,
           SUM(p2.published) as published,
           SUM(p3.pending) as pending,
           SUM(p4.scheduled) as scheduled,
           SUM(p5.draft) as draft,
           SUM(p6.deleted) as deleted
    FROM posts p . . .
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-29
      • 2019-01-22
      • 2019-02-05
      • 1970-01-01
      • 2018-06-12
      • 1970-01-01
      相关资源
      最近更新 更多