2011-08-06 18 views
26

現在、UNIONとして正常に実行されている2つの選択肢があります。キャッチは、クエリは重複のuser_id(この場合は100)をもたらすあるMYSQL UNION DISTINCT

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

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

結果は次のように戻ってきます。 最初のクエリの詳細が私に先行し、user_idが2番目のクエリで繰り返される場合、私はそれを必要としません。

UNIONを列にDISTINCTにする方法はありますか?この場合、user_id? 上記の呼び出しを行い、重複したuser_idを取得しない方法はありますか? クエリを別の方法で書き直し、UNIONを使用しないでください。 本当に1つのクエリとしてそれをしたい - 私は必要に応じて複製を除外するSELECTとPHPに使用することができます。

THX アダム

答えて

28

いいえ。あなたが持つ個別のに必要な正確などのフィールドを指定することはできません。これは行全体でのみ機能します。あなたの問題のよう

- ちょうどあなたのクエリのサブクエリにし、外側の1 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

あなたはサブクエリと外側の一つのグループによると、右方向に私にプッシュを与えることができます任意のチャンスでユーザーID?テストしていますが、すぐにそこに着くことはありません。 – Adam

+0

@Adam:答えを更新しました。これはクエリのように見えるかもしれませんが、正しいかどうかチェックする機会はありません – zerkms

+0

「x GROUP BY user_id」の「x」が何を意味しているかを知りたい場合は、 by ... 'どこか)、docs/tutorial/linkでお願いしますか? –

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