horizontal - union mysql queries
MySQL selecciona filas donde la uniĆ³n izquierda es nula (6)
Tengo estas tablas de MySQL:
tabla 1:
id | writer
1 | Bob
2 | Marley
3 | Michael
Tabla 2:
user_one | user_two
1 | 2
Y esta consulta:
SELECT table1.id FROM table1 LEFT JOIN table2 ON table1.id = table2.user_one
Esta consulta devolverá todas las filas de table1 que son 1,2,3
Quiero seleccionar solo las filas que no se encuentran en la unión izquierda. Por lo que debería devolver solo la fila con id 3
Quiero una especie de opuesto a INNER JOIN que seleccionará solo las filas que se encuentran en la unión. Cómo obtener lo contrario, como si existe una combinación a la izquierda, ignórelo y pase a la siguiente fila. Espero que quede claro
Aquí hay una consulta que devuelve solo las filas donde no se ha encontrado correspondencia en las columnas user_one
y user_two
de table2
:
SELECT T1.*
FROM table1 T1
LEFT OUTER JOIN table2 T2A ON T2A.user_one = T1.id
LEFT OUTER JOIN table2 T2B ON T2B.user_two = T1.id
WHERE T2A.user_one IS NULL
AND T2B.user_two IS NULL
Hay una jointure para cada columna ( user_one
y user_two
) y la consulta solo devuelve filas que no tienen jointure coincidente.
Espero que esto te ayudará.
Intente la siguiente consulta:
SELECT table1.id
FROM table1
where table1.id
NOT IN (SELECT user_one
FROM Table2
UNION
SELECT user_two
FROM Table2)
Espero que esto te ayude.
Podrías usar la siguiente consulta:
SELECT table1.id
FROM table1
LEFT JOIN table2
ON table1.id IN (table2.user_one, table2.user_two)
WHERE table2.user_one IS NULL;
Aunque, dependiendo de sus índices en la table2
, puede encontrar que dos combinaciones funcionan mejor:
SELECT table1.id
FROM table1
LEFT JOIN table2 AS t1
ON table1.id = t1.user_one
LEFT JOIN table2 AS t2
ON table1.id = t2.user_two
WHERE t1.user_one IS NULL
AND t2.user_two IS NULL;
Tratar:
SELECT A.id FROM
(
SELECT table1.id FROM table1
LEFT JOIN table2 ON table1.id = table2.user_one
WHERE table2.user_one IS NULL
) A
JOIN (
SELECT table1.id FROM table1
LEFT JOIN table2 ON table1.id = table2.user_two
WHERE table2.user_two IS NULL
) B
ON A.id = B.id
Ver Demo
O podrías usar dos LEFT JOINS
con alias como:
SELECT table1.id FROM table1
LEFT JOIN table2 A ON table1.id = A.user_one
LEFT JOIN table2 B ON table1.id = B.user_two
WHERE A.user_one IS NULL
AND B.user_two IS NULL
Ver 2da Demo
Uno de los mejores métodos si no desea devolver ninguna columna de la table2
es usar el NOT EXISTS
SELECT table1.id
FROM table1 T1
WHERE
NOT EXISTS (SELECT *
FROM table2 T2
WHERE T1.id = T2.user_one
OR T1.id = T2.user_two)
Semánticamente, esto dice lo que desea consultar: seleccione cada fila donde no haya un registro coincidente en la segunda tabla.
MySQL está optimizado para EXISTS
: regresa tan pronto como encuentra el primer registro coincidente.
SELECT table1.id
FROM table1
LEFT JOIN table2 ON table1.id = table2.user_one
WHERE table2.user_one is NULL