2012-03-13 12 views
7

Tengo dos tablas.mysql consultar dos tablas, UNIÓN y donde cláusula

me consulta como esta:

SELECT * FROM (
    Select requester_name,receiver_name from poem_authors_follow_requests as one 
UNION 
Select requester_name,receiver_name from poem_authors_friend_requests as two 
) as u 
where (LOWER(requester_name)=LOWER('user1') or LOWER(receiver_name)=LOWER('user1')) 

estoy usando UNIÓN porque quiero obtener valores distintos para cada usuario si existe un usuario en la primera tabla y en el segundo.

Por ejemplo:

table1 

nameofuser 
peter 

table2 

nameofuser 
peter 

si Peter está en cualquiera de las tablas que debería obtener el nombre de una sola vez, ya que existe en ambas tablas.

Todavía consigo una fila de la primera mesa y una segunda de la mesa número dos. ¿Qué está mal?

Cualquier ayuda apreciada.

+0

son las columnas de las dos tablas de la misma época? Tal vez en una tabla, la columna es de tipo 'char'y en la otra es de tipo' varchar', podría haber algunos espacios ... –

+0

nop ambos son del mismo tipo de campos – stefanosn

+0

En tu sentencia where, probablemente quieras para hacer referencia a la "u" antes de cada campo ... tan 'donde (LOWER (u.requester_name) = ...' esto es similar a la respuesta que se puede ver en: http://stackoverflow.com/questions/5452233/ where-statement-after-a-union-in-sql –

Respuesta

11

Hay dos problemas con su SQL:

  1. (esto es no la pregunta, pero deben considerarse) mediante el uso de más de WHERE el UNION en lugar de las tablas, crea una pesadilla de rendimiento: MySQL creará una tabla temporal que contiene el UNION, luego lo consultará sobre el WHERE. El uso de un cálculo en un campo (LOWER(requester_name)) lo empeora aún más.

  2. La razón que se produzcan dos filas es, que sólo se UNION DISTINCT suprimir duplicados reales, por lo que la tupla (someuser,peter) y la tupla (someotheruser, peter) dará lugar a la duplicación.

Editar

Para hacer (someuser, peter) un duplicado de (peter, someuser) que puede usar:

SELECT 
    IF(requester_name='peter', receiver_name, requester_name) AS otheruser 
FROM 
    ... 
UNION 
SELECT 
    IF(requester_name='peter', receiver_name, requester_name) AS otheruser 
FROM 
    ... 

Así que sólo selecciona someuser que ya sabe: peter

+0

Gracias por decirme Eugen Rieck, tenías razón, encuentra duplicados como dijiste ... ¿podrías decirme por favor si hay una manera de resolver esto? (Someuser, Peter) o (Peter, Someuser) debería ser un duplicado en mi caso. – stefanosn

+0

¡Edité mi respuesta! –

+0

Muchas gracias enfoque realmente genial ! – stefanosn

-1

Debería poder usar la palabra clave INTERSECT en lugar de hacer una consulta anidada en un UNION.

SELECT member_id, name FROM a 
INTERSECT 
SELECT member_id, name FROM b 

simplemente puede reescribirse a

SELECT a.member_id, a.name 
FROM a INNER JOIN b 
USING (member_id, name) 

http://www.bitbybit.dk/carsten/blog/?p=71

+0

MySQL no admite la palabra clave 'INTERSECT'! – onedaywhen

2

Usted necesita la cláusula where en ambos selecciona:

select requester_name, receiver_name 
from poem_authors_follow_requests 
where LOWER(requester_name) = LOWER('user1') or LOWER(receiver_name) = LOWER('user1') 
union 
select requester_name, receiver_name 
from poem_authors_friend_requests 
where LOWER(requester_name) = LOWER('user1') or LOWER(receiver_name) = LOWER('user1') 

Las dos consultas son independientes el uno del otro , por lo que no deberías tratar de conectarte dobladillo que no sea por union.

+0

¡Lo intenté no funcionaba todavía dos veces! – stefanosn

0

Usted está haciendo la unión antes y luego aplicando la cláusula where. Por lo tanto, obtendría una combinación única de "requester_name, receiver_name" y luego se aplicaría la cláusula where. Aplicar la cláusula where en cada seleccione ...

Select requester_name,receiver_name from poem_authors_follow_requests 
where (LOWER(requester_name)=LOWER('user1') 
     or LOWER(receiver_name)=LOWER('user1')) 
UNION 
Select requester_name,receiver_name from poem_authors_friend_requests 
where (LOWER(requester_name)=LOWER('user1') 
     or LOWER(receiver_name)=LOWER('user1')) 
1

Usted puede utilizar UNION si desea seleccionar filas una tras otra f rom varias tablas o varios conjuntos de filas de una sola tabla, todo como un único conjunto de resultados. UNION está disponible a partir de MySQL 4.0. Esta sección ilustra cómo usarlo. Supongamos que tiene dos tablas que enumeran posibles clientes y reales, una tercera que enumera los proveedores de los que compra suministros y desea crear una sola lista de correo combinando nombres y direcciones de las tres tablas. UNION proporciona una forma de hacer esto. Asumir las tres tablas tienen los siguientes contenidos:

http://w3webtutorial.blogspot.com/2013/11/union-in-mysql.html

0

En su estado de cuenta donde, hacer referencia al alias de "U" para cada refence campo en su estado de cuenta dónde.

Así que el comienzo de su declaración, donde sería como: where (LOWER(u.requester_name) = ...

Ésta es simlar a la respuesta se puede ver en: WHERE statement after a UNION in SQL?