将 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_idnumber_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 子句简单而正确,并且允许我们使用*说明符。

注意:然而,明智的开发人员在任何情况下都避免使用*说明符。通常最好在查询中列出所需的列。