2010-08-20 5 views
0

J'essaie d'obtenir tous mes messages où Vote IPAddress ne correspond pas à la mienne. Voici mon SQL. Le problème est, je reçois le poste que j'ai voté quand quelqu'un d'autre a également voté pour cela. Je pensais que ce code disait select post quand left join est possible et il n'y a pas d'IPAddr qui == mine. Mais cela ne semble pas se produire. Comment est-ce que j'écris ceci?Mauvais résultats dus à des jointures à gauche

select * from Post 
left join Vote as V on V.post=Post.id AND V.IPAddr<>123 
where flag='1'; 

Voici quelques données fictives pour illustrer le problème.

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); 

Répondre

4
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'; 

Mise à jour:

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 
) 
+0

C'est vraiment comment j'ai écrit le code original. Il n'a pas fonctionné ainsi la réécriture dans la question ci-dessus. –

+0

Ne pense pas que je peux faire plus sans voir des données et des exemples de sortie. – RedFilter

+0

Ok, je vais voir ce que je peux faire. Je devrais avoir quelque chose dans les 10 minutes si je ne finis pas voir la vraie erreur. –

0

Peut-être quelque chose comme ...

SELECT * 
    FROM P 
    WHERE EXISTS (SELECT * 
         FROM V 
         WHERE V.IP IS NOT NULL AND 
          V.IP <> 123  AND 
          P.ID = V.POST); 

est ce que vous recherchez.

3

Est-ce ce que vous cherchez?

SELECT * FROM P 
WHERE NOT EXISTS 
    (SELECT * FROM V 
     WHERE V.post=P.id AND V.ip=123) 
+0

ahh une sous-requête. J'espérais pouvoir faire sans. Je pense que c'est peut-être ma seule sous-requête dans le projet. Oui c'est correct. Accepté l'autre parce qu'il a aidé avant la modification. –

Questions connexes