Seleccione desde donde no estar, excepto
-
23-12-2019 - |
Pregunta
Tengo dos tablas relacionadas. Una de las tablas contiene cada entrada para las fotos y la otra tiene todas las entradas de CAT para cada foto y información de usuario.
photos table:
id
photo (unique filename)
user
cats tables
photo
user
cat
fotos
1 photo1.jpg 40000
2 photo2.jpg 40000
3 photo3.jpg 40000
4 photo4.jpg 40001
5 photo5.jpg 40001
gatos
photo1.jpg 40000 A
photo2.jpg 40000 A
photo1.jpg 40000 B
photo1.jpg 40000 C
photo2.jpg 40000 P
photo3.jpg 40000 A
Cada foto se puede asignar a más categorías para cada usuario
Lo que quiero es seleccionar todas las fotos para el usuario 40000 que no se han incluido en 'P' CAT, incluso si pueden haber sido incluidos en 'A', o 'B' CAT.
Porque foto2.jpg está incluido en P Cat no debe aparecer en los resultados de búsqueda. Mi consulta para el usuario 40000 debería dar los resultados de SOURPOWANTE:
photo1
photo3
Solución
debe ser una simple prueba de unión izquierda / nula
select
p.id,
p.photo
from
photos p
left join cats c
on p.photo = c.photo
AND c.cat = 'P'
where
p.user = 40000
and c.photo is null
Básicamente, la urgencia de la izquierda aún permite que todas las fotos sean calificadas.Sin embargo, si la unión existe específicamente en las categorías de la misma foto y categoría= 'P', entonces tendrá un valor para el "C.Photo".Por lo tanto, en la cláusula Where, he agregado solo para incluir aquellos que no existen (a través de NULL) en la tabla de gato.
Otros consejos
mysql> select * from photos
where photo not in (select photo from cats where cat='P')
and user = '40000';