Necesitas usar GROUP BY
para explicar en qué agrupaciones se debe contar. Sin GROUP BY
solo obtienes un solo grupo de todo el conjunto de resultados, como viste.
En SQL estándar es necesario incluir en el GROUP BY
cláusula cada expresión no agregada que se incluye en el SELECT
cláusula, pero MySQL le permite salirse con la suya sin hacer esto, permitiendo una expresión como la siguiente. (Al menos, cuando no está en modo estricto; no estoy seguro de si el modo estricto refuerza este requisito para que coincida con SQL estándar)
SELECT `items`.*, COUNT(1) AS points
FROM `items` INNER JOIN `points` ON `items`.`id` = `points`.`item_id`
WHERE ...
GROUP BY `items`.`id`
Suponiendo que items.id
es la clave principal de esta tabla, por lo que no aparecerá en más de una fila de items
, esto debería tener el efecto deseado.
Una vez que introduzcas GROUP BY
es importante entender la diferencia entre WHERE
y HAVING
cláusulas. El primero aplica la condición antes se aplican el grupo y los agregados, mientras que este último se aplica después . Esto significa que debe usar HAVING
si quieres hacer un condicional basado en ese conteo; el WHERE
La cláusula en su ejemplo inicial se aplicará antes del agregado, por lo que el resultado será el recuento de puntos creados después de la fecha dada.