将 GROUP BY 与 SELECT 混淆以及如何修复它
有时查询看起来像这样,在 SELECT
子句中使用了*
。
SELECT item.*, /* nonstandard */
COUNT(*) number_of_uses
FROM item
JOIN uses ON item.item_id, uses.item_id
GROUP BY item.item_id
这样的查询需要重构以符合 ONLY_FULL_GROUP_BY
标准。
为此,我们需要一个子查询,它正确地使用 GROUP BY
来返回每个 item_id
的 number_of_uses
值。这个子查询很简短,因为它只需要查看 uses
表。
SELECT item_id, COUNT(*) number_of_uses
FROM uses
GROUP BY item_id
然后,我们可以使用 item
表加入该子查询。
SELECT item.*, usecount.number_of_uses
FROM item
JOIN (
SELECT item_id, COUNT(*) number_of_uses
FROM uses
GROUP BY item_id
) usecount ON item.item_id = usecount.item_id
这使得 GROUP BY
子句简单而正确,并且允许我们使用*
说明符。
注意:然而,明智的开发人员在任何情况下都避免使用*
说明符。通常最好在查询中列出所需的列。