【问题标题】:Mysql ONLY_FULL_GROUP_BY + Join + GroupBy + Count = invalid countMysql ONLY_FULL_GROUP_BY + Join + GroupBy + Count = 无效计数
【发布时间】:2017-06-19 19:38:43
【问题描述】:

我正在尝试运行如下查询:

SELECT cc.slug AS cc_slug
     , cp.slug AS cp_slug
     , COUNT(cp.id) 
  FROM catalog_categories AS cc 
  LEFT 
  JOIN catalog_products cp 
    ON cc.id = cp.category_id 
 GROUP 
    BY cc.id
     , cp.id

并期望获得每个类别的关联产品数量,但我只检索“0”和“1”而不是正确的计数。它是由第二组group by ... cp.id 引起的,但由于启用了 ONLY_FULL_GROUP_BY,因此无法将其删除。因此,例如,如果我运行类似查询(不按联接表分组):

SELECT COUNT(cp.id) 
  FROM catalog_categories AS cc 
  LEFT 
  JOIN catalog_products cp 
    ON cc.id = cp.category_id 
 GROUP 
    BY cc.id

我得到了正确的结果,但问题是我需要 SELECT 中的所有这些字段和别名。

有什么办法可以解决这个问题吗?

【问题讨论】:

    标签: mysql sql select group-by left-join


    【解决方案1】:

    您可以将cp.id 放在这样的聚合函数中:

    SELECT COUNT(cp.id), MAX(cp.id) 
    FROM catalog_categories AS cc 
    LEFT JOIN catalog_products cp ON cc.id = cp.category_id 
    GROUP BY cc.id
    

    这样您就可以根据cc.id 选择最大的cp.id

    【讨论】:

    • Giorgos,它可以工作,但在我的情况下,我的查询是自动生成的,我将 cp.id 别名为“cp_id”,mysql 忽略了“cp.id”聚合并继续产生错误。
    • @pandomic 然后改用MAX(cp_id)
    【解决方案2】:

    我想这就是你想要的:

    SELECT cc.slug AS cc_slug, cp.slug AS cp_slug, COUNT(cp.id)
    FROM catalog_categories cc LEFT JOIN
         catalog_products cp
         ON cc.id = cp.category_id
    GROUP BY cc.slug, cp.slug;
    

    非聚合列应该在GROUP BY中。

    编辑:

    这是你想要的吗?

    SELECT cc.slug AS cc_slug, COUNT(cp.id)
    FROM catalog_categories cc LEFT JOIN
         catalog_products cp
         ON cc.id = cp.category_id
    GROUP BY cc.slug;
    

    【讨论】:

    • 戈登,我通常不会编辑你的答案。但我不认为您打算将AS cc_slug 包含在GROUP BY 子句中。 +10。我们在 GROUP BY 子句中包含所有非聚合表达式。 (当优化器可以确定存在函数依赖时,一些数据库会让我们通过省略一些表达式(例如文字)来滑动。
    • 我仍然得到 1/0 结果而不是实际计数
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-24
    • 2018-03-05
    • 1970-01-01
    • 1970-01-01
    • 2016-12-16
    • 1970-01-01
    • 2023-03-04
    相关资源
    最近更新 更多