2014-10-05 3 views
1

두 테이블, followfollowed이 있습니다. follow.screen != followed.following_screen_name과 같이 follow 테이블의 모든 행을 가져 오려고합니다.두 테이블 간의 MySQL 테이블 비교

추적 테이블

ID screen_name 
----------------- 
1  eddie 
2  jason 
3  omar 
4  jonathan 
5  jack 

SELECT follow.screen_name from follow, followed where followed.my_screen_name='john' 
AND follow.screen_name != followed.following_screen_name 
를 작동하지 않았다 내가 노력 테이블

ID my_screen_name following_screen_name 
------------------------------------------- 
1  john    eddie 
2  kenny    eddie 
3  kenny    omar 
4  john    jason 
5  john    omar 

쿼리를 따라

예상 결과

ID screen_name 
----------------- 
1  jonathan  
2  jack  

답변

3

당신이 LEFT JOIN

SELECT F.screen_name FROM follow F 
LEFT JOIN followed FD 
on F.screen_name = FD.my_screen_name 
OR F.screen_name = FD.following_screen_name 
WHERE FD.my_screen_name IS NULL 
and FD.following_screen_name IS NULL 

또 다른 방법을 수행하여이 얻을 수있는 것은 다음에 존재하는 모든 행을 얻을 NOT EXISTS을 사용하는 것입니다 얻을하는 조항이 존재하지 않습니다 원하는 결과.

SELECT F.screen_name FROM follow F 
WHERE NOT EXISTS 
(
    SELECT 1 FROM followed FD 
    WHERE F.screen_name = FD.my_screen_name 
    OR F.screen_name = FD.following_screen_name 
) 
+0

+1. "외부 조인"질의의 WHERE 절에있는 술어는 이것을 "anti-join"패턴 ...'F'의 모든 행과'D'의 일치하는 행으로 만든 다음 일치하는 모든 행을 제외시킵니다 . (지정된 결과 집합을 반환하는 패턴이 여러 개 있음을 지적하십시오.) – spencer7593

+0

@ JohnDoe, 첫 번째 조건으로 F.screen_name을 John으로 바꾸고 OR을 AND로 바꿔야합니다. 여기는 SQL 바이올린입니다. http://www.sqlfiddle.com/#!2/7ef0a/5 – radar

+0

고마워, 형제 사랑해! –

0

는이 문제를 해결하기 위해 많은 방법이 있지만 모두에게 공통의 당신이 followed.my_screen_name 및 followed.following_screen__name 모두에 follow.screen_name를 비교해야한다는 것입니다.

한 가지 방법은 UNION과 NOT IN 사용하는 것입니다 :이 방법은 명확성을 위해 좋은

select screen_name 
from follow 
where screen_name not in (
    select following_screen_name 
    from followed 
    where following_screen_name is not null 
    union all 
    select my_screen_name 
    from followed 
    where my_screen_name is not null 
) 

동안 존재하지 조인 왼쪽을 사용하거나, 그것은 성능이 좋지 않을 수 있습니다.

+0

하위 쿼리가 NULL 값을 반환하지 않도록주의해야합니다. (우리는 컬럼이 NULL이 아니지만 그 보증이 없다는 보장을 할 수 있는데,보다 일반적인 경우 서브 쿼리에'col IS NOT NULL' 술어를 추가해야합니다.) – spencer7593

+0

@ spencer7593 사실. – jpw

0

mysql 구문과 논리를 선택하는 좋은 장소는 here입니다. 그러나이 코드를 시도, 그것은 SCREEN_NAME 다음 두 개의 쿼리에서 생산되는 것도 동일하지 않은 모든 행 선택 :

SELECT * from follow WHERE screen_name 
not in (select screen_name from followed) 
AND not in (select followed_screen_name from followed); 

마지막 두 쿼리는이 보일 것을하고 WHERE은 화면에서 모든 행을 필터링 아래의 필드와 동일한 이름.

my_screen_name following_screen_name 
------------------------------------- 
john    eddie 
kenny    eddie 
kenny    omar 
john    jason 
john    omar 
+0

그게 쉬운 수정, 고마워! – apoorvk

+0

하위 쿼리 중 하나가 NULL 값을 반환하면 외부 쿼리는 0 행을 반환합니다. (식 'col NOT IN ('a ', NULL, ...))'는'col <> NULL AND col <> 'a'와 동등하므로 TRUE를 반환하지 않습니다. – spencer7593