2011-08-06 29 views
26

Şu anda UNION olarak çalıştığım iki tane seçimim var.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); 

sonuç böyle gel:

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

yakalamak sorgu (bu durumda 100) yinelenen user_id getirecektir olduğunu. İlk sorgudaki ayrıntılar benim için önceliklidir ve eğer user_id ikinci sorguda tekrarlanırsa ona ihtiyacım yoktur.

Bir sütun üzerinde DISTINCT olması için bir UNION almanın bir yolu var mı? bu durumda user_id? Yukarıdaki çağrıyı yapmanın ve yinelenen user_id'leri almanın bir yolu var mı? Sorguyu farklı bir şekilde yeniden yazmalı ve bir UNION kullanmamalı mıyım? Gerçekten tek bir sorgu olarak istiyorum - Gerekirse, çoğaltmak için SELECT ve PHP için kullanabilirim.

thx Adam

cevap

28

sayılı Sen ile ayrı gereken tam hangi alan belirleyemezsiniz. Sadece tüm satır ile çalışır. Sorunun itibariyle

- Sadece sorgu alt sorgu yapmak ve dış bir 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

Eğer alt sorgu ve dış bir grup tarafından doğru yönde bana bir itme verebilir herhangi bir şans içinde Kullanıcı adı? Bunu daha önce yapmadım, test ettim ama hızlıca oraya gitmiyor ... – Adam

+0

@Adam: bir cevabı güncelledi. Sorgu böyle görünebilir, ancak doğru olup olmadığını kontrol etme şansına sahip değilsiniz. – zerkms

+0

Eğer 'x' grubundaki 'x' ifadesinin ne anlama geldiğini öğrenmek istersem (siparişi okudum) ... 'bir yerlerde', hangi dokümanlar/öğretici/bağlantıyı önerirsiniz? –

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