Я пытаюсь получить все свое сообщение, где Vote IPAddress не соответствует моей собственной. Вот мой SQL. Проблема в том, что я получаю сообщение, за которое я голосовал, когда кто-то еще голосовал за него. Я думал, что этот код говорит о выборе должности, когда возможно объединение слева, и нет IPAddr, который == мой. Но похоже, что это не происходит. Как написать это?
select * from Post
left join Vote as V on V.post=Post.id AND V.IPAddr<>123
where flag='1';
Вот некоторые фиктивные данные, чтобы проиллюстрировать проблему.
create table P(id int primary key, body text);
create table V(id int primary key, val int, ip int, post int);
insert into P values(1,"aaa");
select * from P left join V on V.post=P.id where (V.ip is null or V.ip<>123);
insert into V values(1, 2,123,1);
select * from P left join V on V.post=P.id where (V.ip is null or V.ip<>123);
insert into V values(2, 2,13,1);
select * from P left join V on V.post=P.id where (V.ip is null or V.ip<>123);
select *
from Post p
left join Vote as V on V.post=p.id
where (V.IPAddr is null or V.IPAddr<>123)
and flag='1';
Update:
select *
from P
left outer join V on V.post=P.id
where not exists (
select 1 from v
where IP = 123
and post = p.id
)
Это то, что вам нужно?
SELECT * FROM P
WHERE NOT EXISTS
(SELECT * FROM V
WHERE V.post=P.id AND V.ip=123)
Возможно, что-то вроде...
SELECT *
FROM P
WHERE EXISTS (SELECT *
FROM V
WHERE V.IP IS NOT NULL AND
V.IP <> 123 AND
P.ID = V.POST);
- это то, что вы ищете.