Question

J'ai deux tables connexes. L'une des tables contient chaque entrée pour les photos et l'autre dispose de toutes les entrées de CAT pour chaque photo et info utilisateur.

photos table:
id
photo (unique filename)
user


cats tables

photo
user
cat

Photos

1    photo1.jpg    40000
2    photo2.jpg    40000
3    photo3.jpg    40000
4    photo4.jpg    40001
5    photo5.jpg    40001

chats

photo1.jpg    40000    A
photo2.jpg    40000    A
photo1.jpg    40000    B
photo1.jpg    40000    C
photo2.jpg    40000    P
photo3.jpg    40000    A

Chaque photo peut être affectée à plus de catégories pour chaque utilisateur

Ce que je veux, c'est de sélectionner toutes les photos pour l'utilisateur 40000 qui n'ont pas été incluses dans «P» Chat, même s'ils ont peut-être été inclus dans 'A', ou 'B' CAT.

Parce que Photo2.jpg est inclus dans P CAT ne doit pas apparaître dans les résultats de la recherche. Ma requête pour l'utilisateur 40000 devrait donner les résultats débutants:

photo1
photo3

Était-ce utile?

La solution

devrait être un simple test gauche-join / null

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

Fondamentalement, la join gauche permet toujours à toutes les photos d'être qualifiée.Toutefois, si la jointure existe spécifiquement dans la table des catégories par la même photo et la même catégorie= 'P', il aura une valeur pour le "C.Photo".Donc, dans la clause Where, j'ai ajouté que celles qui n'existent pas (via NULL) existent dans la table de chat.

Autres conseils

mysql> select * from photos 
       where photo not in (select photo from cats where cat='P') 
       and user = '40000';
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top