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.