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

¿Fue útil?

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';
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top