Select photos by multiple tags
mysql, sql
Solution
I think you're going to have to join the tags table to the photos table four times... pretty ugly.
SELECT Photos.*
FROM
Photos
JOIN (
Tagsphotos JOIN Tags ON (Tags.id = Tagsphotos.tag)
) t1 ON (t1.photo = Photos.id)
JOIN (
Tagsphotos JOIN Tags ON (Tags.id = Tagsphotos.tag)
) t2 ON (t2.photo = Photos.id)
JOIN (
Tagsphotos JOIN Tags ON (Tags.id = Tagsphotos.tag)
) t3 ON (t3.photo = Photos.id)
JOIN (
Tagsphotos JOIN Tags ON (Tags.id = Tagsphotos.tag)
) t4 ON (t4.photo = Photos.id)
WHERE
(t1.name = 'dirty' AND t2.name = 'road')
AND (t3.name = 'light.front' OR t3.name = 'light.side')
AND (t4.name = 'perspective.two-point')
Subqueries would probably be faster:
SELECT *
FROM Photos
WHERE
Photos.id IN (
SELECT Tagspohotos.photo
FROM Tagsphotos JOIN Tags ON (Tags.id = Tagsphotos.tag)
WHERE Tags.name = 'dirty'
)
AND Photos.id IN (
SELECT Tagspohotos.photo
FROM Tagsphotos JOIN Tags ON (Tags.id = Tagsphotos.tag)
WHERE Tags.name = 'road'
)
AND Photos.id IN (
SELECT Tagspohotos.photo
FROM Tagsphotos JOIN Tags ON (Tags.id = Tagsphotos.tag)
WHERE Tags.name = 'light.front' OR Tags.name = 'light.side'
)
AND Photos.id IN (
SELECT Tagspohotos.photo
FROM Tagsphotos JOIN Tags ON (Tags.id = Tagsphotos.tag)
WHERE Tags.name = 'perspective.two-point'
)
Problem
I have three MySQL tables - photos, tags and tagsphotos - and m:n relationship between photos and tags. ``` Photos: id | filename | ... Tags: id | name Tagsphotos: photo | tag ``` I want to select all photos with this condition: ``` (tagged as "dirty" AND tagged as "road") AND (tagged as "light.front" OR tagged as "light.side") AND (tagged as "perspective.two-point") ``` ...which means that I want to find all pictures with dirty road, in two-point perspective and either with side or front light. How can I do it? Thanks.