Devi usare GROUP BY
per spiegare su quali raggruppamenti contare. Senza GROUP BY
ottieni solo un singolo gruppo dell'intero set di risultati, come hai visto.
In SQL standard è necessario includere nel GROUP BY
clausola ogni espressione non aggregata inclusa in SELECT
clausola, ma MySQL ti consente di farla franca senza farlo, consentendo un'espressione come la seguente. (Almeno, quando non in modalità rigorosa; non sono sicuro che la modalità rigorosa rafforzi questo requisito per soddisfare lo standard SQL)
SELECT `items`.*, COUNT(1) AS points
FROM `items` INNER JOIN `points` ON `items`.`id` = `points`.`item_id`
WHERE ...
GROUP BY `items`.`id`
Supponendo che items.id
è la chiave primaria di questa tabella, quindi non apparirà in più di una riga di items
, questo dovrebbe avere l'effetto desiderato.
Dopo aver introdotto GROUP BY
è importante capire la differenza tra WHERE
e HAVING
clausole. Il primo applica la condizione prima si applicano il gruppo e gli aggregati, mentre il secondo si applica successivamente . Ciò significa che devi utilizzare HAVING
se vuoi fare un condizionale basato su quel conteggio; il WHERE
la clausola nel tuo esempio iniziale si applicherà prima dell'aggregato, quindi il risultato sarà il conteggio dei punti creati dopo la data indicata.