2010-08-20 4 views
0

투표 IPAddress가 내 자신과 일치하지 않는 모든 게시물을 가져 오려고합니다. 여기에 내 SQL이있다. 문제는 누군가 다른 사람이 투표했을 때 내가 투표 한 투표를받는 것입니다. 나는이 코드가 왼쪽 join이 가능하고 어떤 IPAddr == 내 것이 없을 때 select post라고 말한 것으로 생각했다. 하지만 그 일은 일어나지 않는 것 같습니다. 이것을 어떻게 써야합니까?왼쪽 연결로 인해 잘못된 결과가 나타납니다.

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

답변

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

업데이트 :

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

실제로 원본이 코드를 어떻게 작성했는지. 그것은 위의 질문에서 다시 쓰는 작업도하지 못했습니다. –

+0

데이터 및 예제 출력을 보지 않고도 더 많은 작업을 수행 할 수 있다고 생각하지 마십시오. – RedFilter

+0

좋아, 내가 할 수있는 걸 보게. 나는 진짜 실수를 보는 것을 끝내지 않으면 10 분 이내에 뭔가를 가져야한다. –

0

아마도 뭔가 같은 ...

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

가 당신을 위해 무엇을 찾고 있습니다.

3

이것이 필요한가요?

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

하위 쿼리가 있습니다. 내가없이 할 수 있기를 바랐다. 나는 이것이 프로젝트에서 나의 하위 쿼리일지도 모른다라고 생각한다. 네, 맞습니다. 그가 편집하기 전에 도움을 주었기 때문에 다른 쪽을 받아 들였습니다. –

관련 문제