2011-11-16 11 views
8

Tengo 2 tablas de una base de datos MySQL:MySQL seleccione los campos de una tabla que no están en otra mesa

Table 1 : id, galleryname 
Table 2 : galleryid, <many other fields...> 

usando PHP, que necesitan para seleccionar todas las filas de la Tabla 1 en función de su ID en ese id (galleryid) no aparece en la Tabla 2.

Ejemplo: Tabla 1

1, flowers 
2, water 
3, mountains 
4, winter 

Tabla 2

3, ... 

volvería estas filas de la Tabla 1

1, flowers 
2, water 
4, winter 

No estoy exactamente seguro de cómo hacer esto. Soy bastante bueno en lo básico de MySQL, pero sospecho que se trata de un JOIN o UNION que está fuera de mi alcance.

Cualquier ayuda es apreciada.

Respuesta

19

Prueba esto:

SELECT * FROM table1 
WHERE id NOT IN 
    (SELECT galleryid FROM table2) 

o

SELECT * FROM table1 
LEFT JOIN table2 
    ON table1.id = table2.galleryid 
WHERE table2.galleryid IS NULL 
+0

bastante seguro de que tiene que ajustar su sub selección en '()' para que funcione su instrucción 'IN'. –

+1

@ AdamWenger: sí, estoy seguro de que tengo que ... ¡simplemente lo olvidé! ¡¡Gracias por tu sugerencia!! :) – Marco

7

se unen a la izquierda hace uso de todos los registros t1, luego filtrar a aquellos que han t2.galleryid NULL (no hay registros en t2)

SELECT id, galleryname 
FROM table1 AS t1 
LEFT OUTER JOIN table2 AS t2 ON t1.id = t2.galleryid 
WHERE t2.galleryid IS NULL 
+0

Buena consulta limpia con un comentario muy claro sobre qué está pasando. Para mí, esta es la respuesta correcta y la mejor manera de abordar el problema en cuestión, ya que usar sub-selects en tablas grandes no es una buena idea – Shmarkus

2
SELECT * FROM table1 
LEFT JOIN table2 
ON table1.id = table2.galleryid 
WHERE table2.galleryid IS NULL 
1

Alguien ha publicado una respuesta (luego eliminar d) que me dio SOLAMENTE el registro que estaba en ambos. Todos los demás aquí parecían dar errores pero al usar esa publicación original hice un cambio y funcionó.

original:

SELECT * FROM table1 INNER JOIN table2 ON galleries.id = images.galleryid 

(Esto me dio sólo el que estaba en ambos)

Agregar el:

SELECT * FROM table1 INNER JOIN table2 ON galleries.id != images.galleryid 

(esto me dio lo que necesitaba)

+0

Una unión interna usando! = Es una muy mala práctica. Esto primero crea un producto cartesiano de las dos tablas, luego filtra las filas correspondientes. A medida que aumenta el número de filas en cada tabla, esto se vuelve terriblemente ineficiente. –

Cuestiones relacionadas