Проблема с левым соединением, где AND - PullRequest
0 голосов
/ 19 июня 2010

Вот несколько жестко закодированных синтаксисов.IPAddr - это int, это sqlite и будет перенесено в mysql.

Синтаксис не работает с AND V.IPAddr <> 0.Возможно, потому что V является левым соединением и может не существовать (нуль?).Как мне добиться успеха, когда V == null || V.IPAddr <> Val?

select Post.id, name, body,
      (select count() from Votes where id=Post.id AND (type & 4)<> 0) as DV
   from Post 
left join Votes as V on V.id=Post.id
   where flag='1'  AND V.IPAddr <> 0 AND DV<1
   limit 1

Ответы [ 2 ]

5 голосов
/ 19 июня 2010

Переместите внешний фильтр в состояние JOIN. В противном случае фильтр меняет его на INNER JOIN

select Post.id, name, body,
(select count() from Votes where id=Post.id AND (type & 4)<> 0) as DV
from Post 
left join Votes as V on V.id=Post.id AND V.IPAddr <> 0 
where flag='1' AND DV<1
limit 1
2 голосов
/ 19 июня 2010

Лучше всего решение Gbn, но есть два других решения.Вы можете использовать подзапрос:

from      Post p
left join (
          select  *
          from    Votes
          where   IPAddr <> 0
          ) v
on        v.id = p.id

или улучшенный оператор where:

from      Post p
left join Votes v
on        v.id = p.id
where     (IPAddr <> 0 or IPAddr is null)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...