將 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 子句簡單而正確,並且允許我們使用*說明符。

注意:然而,明智的開發人員在任何情況下都避免使用*說明符。通常最好在查詢中列出所需的列。