2011-08-06 10 views
26

현재 UNION으로 성공적으로 실행중인 선택 항목이 두 개 있습니다.MYSQL UNION DISTINCT

(SELECT a.user_id,a.updatecontents as city,b.country 
FROM userprofiletemp AS a 
LEFT JOIN userattributes AS b ON a.user_id=b.user_id 
WHERE typeofupdate='city') 

UNION DISTINCT 

(SELECT a.user_id,c.city,c.country 
FROM userverify AS a 
LEFT JOIN userlogin AS b ON a.user_id=b.user_id 
LEFT JOIN userattributes AS c ON a.user_id=c.user_id 
WHERE b.active=1 AND a.verifycity=0); 

결과는 다음과 같이 돌아올 :

100 Melbourne Australia 
200 NewYork America 
300 Tokyo Japan 
100 Sydney Australia 

캐치 쿼리 (이 경우 100에) 중복 USER_ID를 가져올 것입니다. 첫 번째 쿼리의 세부 정보가 나에게 선행하고 user_id가 두 번째 쿼리에서 반복되는 경우 필자는 필요하지 않습니다.

UNION이 열에 DISTINCT가되는 방법이 있습니까? 이 경우 user_id? 위의 호출을 수행하고 중복되는 user_id를 가져 오는 방법이 없습니까? 두 번째를 삭제하십시오. 쿼리를 다르게 작성하고 UNION을 사용하지 않아야합니까? 정말 하나의 쿼리로 원합니다. SELECT 및 PHP를 사용하여 필요할 경우 중복 제거 할 수 있습니다.

들으 아담

답변

28

번호 당신은 당신과 구별 할 필요가 정확히 어떤 분야 지정할 수 없습니다. 전체 행에서만 작동합니다. 문제의로

- 당신의 쿼리 하위 쿼리하고 외부 하나 GROUP BYuser_id

SELECT * FROM 
(SELECT a.user_id,a.updatecontents as city,b.country 
FROM userprofiletemp AS a 
LEFT JOIN userattributes AS b ON a.user_id=b.user_id 
WHERE typeofupdate='city') 

UNION DISTINCT 

(SELECT a.user_id,c.city,c.country 
FROM userverify AS a 
LEFT JOIN userlogin AS b ON a.user_id=b.user_id 
LEFT JOIN userattributes AS c ON a.user_id=c.user_id 
WHERE b.active=1 AND a.verifycity=0) x 
GROUP BY user_id 
+0

당신이 하위 쿼리 및 외부 하나 개의 그룹으로 함께 올바른 방향으로 나에게 밀어 줄 수있는 어떤 기회에 user_id? 전에 테스트를 해보지 않았지만 빨리 테스트를 통과하지 못했습니다. – Adam

+0

@Adam : 답변을 업데이트했습니다. 그건 쿼리가 어떻게 생겼는지는 알 수 있지만, 맞는지 확인할 수는 없습니다. – zerkms

+0

'x GROUP BY user_id'의 'x'가 무엇을 의미하는지 알아보고 싶다면 (' by ... '어딘가에), 어느 문서/튜토리얼/링크를 권해 주시겠습니까? –

1
(SELECT a.user_id,a.updatecontents as city,b.country 
FROM userprofiletemp AS a 
LEFT JOIN userattributes AS b ON a.user_id=b.user_id 
WHERE typeofupdate='city') 

UNION ALL 

(SELECT a.user_id,c.city,c.country 
FROM userverify AS a 
LEFT JOIN userlogin AS b ON a.user_id=b.user_id 
LEFT JOIN userattributes AS c ON a.user_id=c.user_id 
WHERE b.active=1 AND a.verifycity=0 
    AND a.user_id NOT IN 
     (SELECT user_id 
     FROM userprofiletemp 
     WHERE typeofupdate='city' 
    ) 
);