任務:向每個商店顯示購買量最高的產品。
3桌:商店,產品,付款。如果銷售給1個商店的產品有捆綁,那麼挑選哪個產品並不重要,只需選擇其中一個。MySQL分組問題:與sql_mode = only_full_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,因爲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
@ e4c5 1付款有1個產品,1個產品有0..N付款。支付表中的每一行代表一個已售出的產品,所以我就這樣做了一個計數器,因此我知道特定產品已售出多少次。 – Amodar
我不確定原始結果是否正確,因爲從原始數據看來,shop_id 2每個產品3和4都銷售了1件。您希望如何處理聯繫?這是應該考慮的事情。 – CGritton