【发布时间】:2016-11-18 12:50:38
【问题描述】:
任务:显示每个商店购买最多的产品。
3 个表格:商店、产品、付款。如果销售给 1 家商店的产品出现平局,则选择哪种产品并不重要,只需选择其中一种即可。
我对此查询的 group by 子句有疑问:
SELECT shop_id, product_id,
(
SELECT COUNT(*)
FROM payment
WHERE product.product_id = payment.product_id
) sold
FROM product
GROUP BY shop_id
HAVING MAX(sold)
在 MySQL 5.6 或更低版本中,此查询可以工作。 这将是正确的结果:
shop_id | product_id | sold
1 1 3
2 3 1
3 5 1
但在 5.7 上,我遇到了与 sql_mode=only_full_group_by 不兼容的问题,因为 select 中的 product_id 包含非聚合数据。
完整的错误信息:
Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'product.product_id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
所以我认为的解决方案是在组中添加 product_id,如下所示:
SELECT shop_id, product_id,
(
SELECT COUNT(*)
FROM payment
WHERE product.product_id = payment.product_id
) sold
FROM product
GROUP BY shop_id, product_id
HAVING MAX(sold)
修复了错误但返回了错误的结果,它不再使商店列唯一。我得到了这个:
shop_id | product_id | sold
1 1 3
1 2 4
2 3 1
2 4 1
3 5 1
SQLfiddle 使用 MySQL 5.6,但为了让每个人的生活更轻松:http://sqlfiddle.com/#!9/ca12bf9/6
【问题讨论】:
-
不清楚的是为什么您在这里使用付款表
-
@e4c5 1 次付款有 1 个产品,1 个产品有 0..N 次付款。付款表中的每一行都代表一种已售出的产品,这就是为什么我要对其进行 COUNT 以了解特定产品已售出多少次。
-
我也不确定原始结果是否正确,因为从原始数据来看,shop_id 2 销售了 1 个产品 3 和 4。您希望如何处理领带?这是应该考虑的事情。
-
@CGritton Ties 无关紧要,对不起,我忘了包括在内。如果有平局,它可以选择第一行或随机一个,但必须选择一个。
标签: mysql