оставленное соединение с группой по возвращению не содержит строк, если таблица не содержит определенного идентификатора - PullRequest
0 голосов
/ 14 июня 2019

skize

Я хочу узнать, сколько людей оценило конкретное место.проблема в том, что мой sql работает ТОЛЬКО если таблица hasVotedLocation содержит идентификатор конкретного местоположения.То есть, если никто не проголосовал за определенное место, я получаю ноль строк.

Мой SQL-оператор:

select count(*),l.idLoc from Location l
left join hasVotedLocation hvl
on hvl.idLoc=l.idLoc where l.idLoc=2
group by l.idLoc 

d

Для idLoc=1запрос должен возвращать одну строку с count(*)=3 and idLoc=1

для idLoc=2 запрос должен возвращать одну строку с count(*)=0 and idLoc=2

для idLoc=3 запрос должен возвращать одну строку с count(*)=1 and idLoc=3

Ответы [ 2 ]

0 голосов
/ 14 июня 2019

В запросе 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 * вернет ноль строк.

0 голосов
/ 14 июня 2019

Вы можете удалить GROUP BY:

select <someid> as idLoc, count(x)
from Location l left join
     hasVotedLocation hvl
     on hvl.idLoc = l.idLoc ;

Это всегда вернет одну строку.count() будет 0, если нет подходящих строк.

...