2011-08-06 19 views
26

Tengo dos selecciones que estoy ejecutando actualmente como UNION con éxito.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); 

Los resultados vuelven así:

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

El problema es la consulta traerá user_id duplicado (en este caso el 100). Los detalles en la primera consulta tienen precedentes para mí y si el ID_usuario se repite en la segunda consulta, no lo necesito.

¿Hay alguna manera de hacer que UNIÓN sea DISTINTA en una columna? en este caso el user_id? ¿Hay alguna manera de hacer la llamada anterior y no obtener user_id duplicado? Descarte el segundo. Debería volver a escribir la consulta de manera diferente y no usar UNIÓN. Realmente lo quiero como una consulta: puedo usar SELECT y PHP para eliminar el duplicado si es necesario.

THX Adam

Respuesta

28

No. No es posible especificar qué campo exacto que necesita con distinta. Solo funciona con toda la fila.

A partir de su problema - sólo hacer su consulta una subconsulta y exterior uno 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

alguna posibilidad de que me puede dar un empujón en la dirección correcta con la sub consulta y un grupo externo por ¿identidad de usuario? no lo había hecho antes, probando pero no llegando rápidamente ... – Adam

+0

@Adam: actualizó una respuesta. Así es como podría ser la consulta, pero no tiene oportunidad de comprobar si es correcta – zerkms

+0

Si me gustaría saber qué significa la 'x' en 'x GROUP BY user_id' (también he leído 'una orden por ... 'en algún lugar), ¿qué documentos/tutorial/enlace recomendaría, por favor? –

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