В запросе GROUP BY COUNT(*)
возвращает количество строк в группе. Однако если условие в предложении ON в LEFT JOIN не совпадает ни с одной строкой в правой таблице, результатом будет одна строка, в которой все столбцы правой таблицы заполнены значениями NULL. Это все еще один ряд, а не ноль. Таким образом, COUNT(*)
никогда не вернет значение меньше 1
в этом запросе. Но результат также не будет "нулевыми строками" (как вы указали в своем вопросе), если условие в предложении WHERE соответствует любой строке в левой таблице.
Чтобы получить количество совпадений в правой таблице (количество голосов в вашем случае), вы должны посчитать количество ненулевых значений из правой таблицы. Обычно лучше использовать тот же столбец, что и в предложении ON (таким образом, движок может использовать тот же индекс без второго поиска), который будет COUNT(hvl.idLoc)
.
select count(hvl.idLoc), l.idLoc from Location l
left join hasVotedLocation hvl
on hvl.idLoc=l.idLoc where l.idLoc = ?
group by l.idLoc
Однако - если все, что вам нужно, это количество голосов для определенного значения idLoc
, вы можете просто использовать простой запрос COUNT(*)
.
select count(*)
from hasVotedLocation
where idLoc = ?
Примечание. В этом запросе COUNT(*)
вернет 0
, если условие WHERE не соответствует ни одной строке. Это потому, что SELECT *
вернет ноль строк.