Sélectionnez depuis où pas dans - sauf
-
23-12-2019 - |
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
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';