2012-06-10 16 views
24

Parece que no puedo entender esto hasta ahora. Intento unir dos tablas y solo seleccionar las filas de la tabla A que no tienen una columna correspondiente en la tabla B. Por ejemplo, supongamos que tenemos una tabla de usuarios y una tabla enviada.MySQL selecciona las filas que no tienen columna correspondiente en la otra tabla

users tabla tiene las siguientes columnas: id, username
sent tabla tiene las siguientes columnas: id, username

que desea seleccionar todas las filas de users donde username no existe en sent mesa. Por lo tanto, si tom está en users y en sent, no será seleccionado. Si él está en users pero no en sent, será seleccionado. He intentado esto, pero no funcionó en absoluto:

SELECT pooltest.name,senttest.sentname 
FROM pooltest,senttest 
WHERE pooltest.name != senttest.sentname 

Respuesta

12

Prueba este SQL:

SELECT users.username 
FROM users 
LEFT JOIN sent ON sent.username = users.username 
WHERE sent.username IS NULL; 

La mejor manera en mi opinión sería:

SELECT users.username 
FROM users 
LEFT JOIN sent ON sent.id = users.id 
WHERE sent.id IS NULL; 

Como los campos de identificación, se indexa (clave principal habría pensado) por lo esta consulta estaría mejor optimizada que la primera que sugerí.

Sin embargo, es posible que mi primera sugerencia sea mejor para usted, depende de cuáles sean sus requisitos para su aplicación.

+0

a través de algunos otra ayuda También encontré que esto funcionaba: SELECCIONAR * FROM pooltest LEFT JOIN senttest ON pooltest.name = senttest.sentname WHERE senttest.sentname IS NULL – xendi

53

Normalmente, se usaría NOT EXISTS para este tipo de consulta

SELECT p.Name 
FROM pooltest p 
WHERE NOT EXISTS (SELECT s.Name 
        FROM senttest s 
        WHERE s.Name = p.Name) 

Una alternativa sería utilizar un LEFT OUTER JOIN y comprobar si hay NULL

SELECT p.Name 
FROM pooltest p 
     LEFT OUTER JOIN senttest s ON s.Name = p.Name 
WHERE s.Name IS NULL 

Tenga en cuenta que la sintaxis de unión implícita que está utilizando se considera obsoleta y debe reemplazarse con una unión explícita.

-3

Puede ser éste puede ayudar ....

que también tenía el mismo problema, pero resuelven usando este esta consulta

INSERT INTO tbl1 (id,name) SELECT id,name from tbl2 where (name) not in(select name from tbl1); 

esperanza éste va a resolver su problema

Cuestiones relacionadas