ejemplo - where not in mysql
MySQL SELECT x FROM WHERE NOT IN(SELECT x FROM b)-Resultado inesperado (4)
Espero que el resultado de la tercera consulta a continuación contenga id = 732. No lo hace ¿Porqué es eso?
mysql> SELECT id FROM match ORDER BY id DESC LIMIT 5 ; +------------+ | id | +------------+ | 732 | | 730 | | 655 | | 458 | | 456 | +------------+ 5 rows in set (0.00 sec) mysql> SELECT id FROM email ORDER BY id DESC LIMIT 5 ; +------------+ | id | +------------+ | 731 | | 727 | | 725 | | 724 | | 723 | +------------+ 5 rows in set (0.00 sec) mysql> SELECT * FROM match WHERE id NOT IN ( SELECT id FROM email ) ; Empty set (0.00 sec)
Hay tres entradas NULL en la tabla email.id, y no hay entradas NULL en match.id.
... o si realmente quieres usar NOT IN
puedes usar
SELECT * FROM match WHERE id NOT IN ( SELECT id FROM email WHERE id IS NOT NULL)
Aquí hay algunos SQL que realmente tienen sentido:
SELECT m.id FROM match m LEFT JOIN email e ON e.id = m.id WHERE e.id IS NULL
Simple siempre es mejor.
Estoy un poco fuera de contacto con los detalles de cómo MySQL trata con los nulos, pero aquí hay dos cosas para probar:
SELECT * FROM match WHERE id NOT IN
( SELECT id FROM email WHERE id IS NOT NULL) ;
SELECT
m.*
FROM
match m
LEFT OUTER JOIN email e ON
m.id = e.id
AND e.id IS NOT NULL
WHERE
e.id IS NULL
La segunda consulta parece contraria a la intuición, pero cumple la condición de unión y luego la condición where. Este es el caso donde las uniones y donde las cláusulas no son equivalentes.
De la documentation :
Para cumplir con el estándar
SQL
,IN
devuelveNULL
no solo si la expresión del lado izquierdo esNULL
, sino también si no se encuentra una coincidencia en la lista y una de las expresiones en la lista esNULL
.
Este es exactamente tu caso.
Tanto IN
como NOT IN
devuelven NULL
que no es una condición aceptable para la cláusula WHERE
.
Reescriba su consulta de la siguiente manera:
SELECT *
FROM match m
WHERE NOT EXISTS
(
SELECT 1
FROM email e
WHERE e.id = m.id
)