MySQL卡住并出现Group BY和ONLY_FULL_GROUP_BY错误

时间:2019-02-05 15:20:46

标签: mysql group-by

首先,我想说的是,我知道only_full_group_by限制,并且我理解为什么它采用这种方式。 而且,我希望有一个很好的查询来取消激活该选项。

SELECT campaigns.uuid, campaigns.name, coupons.name, coupons.value, coupons.product_id, coupons.uuid  FROM `campaigns`
LEFT JOIN coupons ON coupons.uuid = campaigns.coupon_id
GROUP BY coupons.product_id
ORDER BY coupons.value DESC

在我的优惠券表中,我可以有几张与同一个product_id相关的优惠券,但我只想按产品退还一张优惠券,其中一张价值较高。

我从4个小时开始挠头,但我找不到解决办法。

谢谢您的帮助。

这是优惠券表的结构(删除了无用的字段):

  • uuid
  • 名称
  • product_id

在哪里可以有3个不同的行:

  • uuid1-名称1-1.5-1
  • uuid2-名称2-0.80-2
  • uuid3-name3-0.90-1

我想返回的只是:

  • uuid1-名称1-1.5-1
  • uuid2-名称2-0.80-2

并跳过名称3,因为它是相同的产品ID,我只想退回价值最高的优惠券。

实际上,我还具有其他表联接来检索一些数据,但是我从示例中跳过了它们以使其更加清晰。

希望它能更好地解释我的意思。

1 个答案:

答案 0 :(得分:0)

最简单的方法是为不属于分组依据的列添加聚合功能

SELECT 
  min(campaigns.uuid)
, min(campaigns.name)
, min(coupons.name)
, min(coupons.value)
, coupons.product_id
, min(coupons.uuid  )
FROM `campaigns`
LEFT JOIN coupons ON coupons.uuid = campaigns.coupon_id
GROUP BY coupons.product_id
ORDER BY coupons.value DESC 

在mysql 5.7之前的版本中,未包含在组中的聚合列的结果是不可预测的(如您的代码)..从5.7开始的版本中,您可以将不可预测的结果替换为由聚合函数结果控制的