tablas queries horizontal create consulta all mysql sql join left-join

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