將 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
子句簡單而正確,並且允許我們使用*
說明符。
注意:然而,明智的開發人員在任何情況下都避免使用*
說明符。通常最好在查詢中列出所需的列。