假设我有这样的查询:
SELECT
items.item_id,
items.name
GROUP_CONCAT(graphics.graphic_id) AS graphic_ids
FROM order_items items
LEFT JOIN order_graphics graphics ON graphics.item_id = items.item_id
WHERE // etc
GROUP BY items.item_id
据我了解,正确的做法是在GROUP_BY
中包含每个未聚合的列,如下所示:
GROUP BY items.item_id, items.name
这是为了防止记录丢失,因为MySQL不知道如何对记录进行分组。但是,我并不热衷于编写包含数十个选定列的查询,并且必须将所有匹配的列保持为GROUP BY
。
我的问题是,为什么按主键items.item_id
进行分组还不够?当然,从技术上讲,MySQL没有明确告知如何处理未分组的列,但我知道永远不会有比主键更多的记录,所以没有一个会丢失。
我是MySQL的新手并且在学习过程中,老实说,不是最干净的遗留代码,但我试图全面了解。那么有些案例我遗失在哪里可能会丢失记录,或者我是否误解了这种做法背后的原因?
(续前:MySQL 'group by' with 'left join' throws away some entries)