Ни одна из ваших попыток не является правильной, хотя первая ближе к правильной.Чтобы отфильтровать теги так, как вы пытаетесь их отфильтровать, вам нужно дважды присоединиться к image_tags
и объединить оба экземпляра tags
, чтобы разделить экземпляры image_tags
.И кажется, что вы хотите делать внутренние соединения, а не внешние соединения.Здесь:
SELECT i.*
FROM images i
INNER JOIN image_tags it0 ON it0.image_id = i.id
INNER JOIN tags t0 ON t0.id = it0.tag_id
INNER JOIN image_tags it1 ON it1.image_id = i.id
INNER JOIN tags t1 ON t1.id = it1.tag_id
WHERE i.filesize > 0
AND t0.tag = 'tagme'
AND t1.tag = 'excellent'
ORDER BY i.posted DESC
LIMIT 0, 40
Есть еще один способ сделать то же самое.Попробуйте выполнить следующее:
SELECT i.*
FROM images i
INNER JOIN image_tags it ON it.image_id = i.id
INNER JOIN tags t ON t.id = it.tag_id
WHERE i.filesize > 0
AND t.tag IN ('tagme', 'excellent')
GROUP BY i.id
HAVING COUNT(DISTINCT i.tag) = 2
ORDER BY i.posted DESC
LIMIT 0, 40
Условие t.tag IN ('tagme', 'excellent')
ограничивает допустимые теги указанным списком, а HAVING COUNT(DISTINCT i.tag) = 2
гарантирует, что изображение получило все из них.