2011-08-06 12 views
26

Mam dwie selekcje, z których aktualnie korzystam jako 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); 

Wyniki wrócić tak:

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

Połów jest kwerenda przyniesie duplikat user_id (w tym przypadku 100). Szczegóły w pierwszym zapytaniu mają dla mnie precedens i jeśli identyfikator użytkownika jest powtórzony w drugim zapytaniu, nie jest mi potrzebny.

Czy istnieje sposób, aby UNION być DISTINCT na kolumnie? w tym przypadku identyfikator użytkownika? Czy jest sposób, aby wykonać powyższe połączenie i nie uzyskać duplikatu user_id's - upuść drugi. Czy należy ponownie napisać zapytanie w inny sposób i nie używać UNION? Naprawdę chcę tego jako jedno zapytanie - mogę użyć SELECT i PHP, aby wyodrębnić duplikat, jeśli to konieczne.

thx Adam

Odpowiedz

28

Nie Nie można określić dokładny zakres trzeba odrębny z. Działa tylko z całym rzędem.

Począwszy od problemu - po prostu zrobić zapytanie podzapytanie i zewnętrzna jeden 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

jakaś szansa, możesz mi dać impuls w dobrym kierunku, z podzapytania i zewnętrznej jednej grupy przez identyfikator użytkownika? nie robiłem tego wcześniej, testowałem, ale nie dotarłem tam szybko ... – Adam

+0

@Adam: zaktualizowałem odpowiedź. W ten sposób zapytanie może wyglądać, ale nie ma szansy sprawdzić, czy jest poprawne. – zerkms

+0

Jeśli chciałbym dowiedzieć się, co oznacza "x" w "x GROUP BY user_id" (również przeczytałem "zamówienie" przez ... gdzieś), który dokument/tutorial/link poleciłbyś proszę? –

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