Seleziona da dove non in - tranne
-
23-12-2019 - |
Domanda
Ho due tabelle correlate. Una delle tabelle contiene ogni voce per le foto e l'altra ha tutte le voci del gatto per ogni foto e informazioni dell'utente.
photos table:
id
photo (unique filename)
user
cats tables
photo
user
cat
.
Foto
1 photo1.jpg 40000
2 photo2.jpg 40000
3 photo3.jpg 40000
4 photo4.jpg 40001
5 photo5.jpg 40001
.
gatti
photo1.jpg 40000 A
photo2.jpg 40000 A
photo1.jpg 40000 B
photo1.jpg 40000 C
photo2.jpg 40000 P
photo3.jpg 40000 A
.
Ogni foto può essere assegnata a più categorie per ogni utente
Quello che voglio è selezionare Tutte le foto per l'utente 40000 che non sono stati inclusi nel gatto "P" anche se potrebbero essere stati inclusi in "A", o "B" Cat.
Poiché Photo2.jpg è incluso nel gatto P non dovrebbe apparire nei risultati della ricerca. La mia query per l'utente 40000 dovrebbe dare i risultati foower:
photo1
photo3
. Soluzione
dovrebbe essere un semplice test a sinistra / 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
.
Fondamentalmente, la sinistra Join consente comunque tutte le foto di essere qualificate.Tuttavia, se il join specificamente esiste nella tabella delle categorie dalla stessa foto e della stessa categoria= 'P', quindi avrà un valore per "c.photo".Quindi nella clausola WHERE, ho aggiunto per includere solo quelli che non sono (via NULL) esistono nel tavolo del gatto.
Altri suggerimenti
mysql> select * from photos
where photo not in (select photo from cats where cat='P')
and user = '40000';
.