Sometimes a query looks like this, with a *
in the SELECT
clause.
SELECT item.*, /* nonstandard */
COUNT(*) number_of_uses
FROM item
JOIN uses ON item.item_id, uses.item_id
GROUP BY item.item_id
Such a query needs to be refactored to comply with the ONLY_FULL_GROUP_BY
standard.
To do this, we need a subquery that uses GROUP BY
correctly to return the number_of_uses
value for each item_id
. This subquery is short and sweet, because it only needs to look at the uses
table.
SELECT item_id, COUNT(*) number_of_uses
FROM uses
GROUP BY item_id
Then, we can join that subquery with the item
table.
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
This allows the GROUP BY
clause to be simple and correct, and also allows us to use the *
specifier.
Note: nevertheless, wise developers avoid using the *
specifier in any case. It's usually better to list the columns you want in a query.