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
.

È stato utile?

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';
.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top