首先,我想说的是,我知道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个小时开始挠头,但我找不到解决办法。
谢谢您的帮助。
这是优惠券表的结构(删除了无用的字段):
在哪里可以有3个不同的行:
我想返回的只是:
并跳过名称3,因为它是相同的产品ID,我只想退回价值最高的优惠券。
实际上,我还具有其他表联接来检索一些数据,但是我从示例中跳过了它们以使其更加清晰。
希望它能更好地解释我的意思。
答案 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开始的版本中,您可以将不可预测的结果替换为由聚合函数结果控制的