Você precisa usar
GROUP BY
para explicar em quais agrupamentos contar com base. Sem GROUP BY
você apenas obtém um único grupo de todo o conjunto de resultados, como você viu. No SQL padrão é necessário incluir no
GROUP BY
cláusula toda expressão não agregada incluída no SELECT
cláusula, mas o MySQL permite que você não faça isso, permitindo uma expressão como a seguinte. (Pelo menos, quando não estiver no modo estrito; não tenho certeza se o modo estrito fortalece esse requisito para corresponder ao SQL padrão) SELECT `items`.*, COUNT(1) AS points
FROM `items` INNER JOIN `points` ON `items`.`id` = `points`.`item_id`
WHERE ...
GROUP BY `items`.`id`
Supondo que
items.id
é a chave primária desta tabela e, portanto, não aparecerá em mais de uma linha de items
, isso deve ter o efeito desejado. Depois de introduzir
GROUP BY
é importante entender a diferença entre o WHERE
e HAVING
cláusulas. O primeiro aplica a condição antes o grupo e os agregados são aplicados, enquanto o último se aplica depois . Isso significa que você deve usar HAVING
se você quiser fazer uma condicional com base nessa contagem; o WHERE
A cláusula em seu exemplo inicial será aplicada antes da agregação, portanto, o resultado será a contagem de pontos criados após a data especificada.