I have two tables in my database: posts, which contains post id and other informations, and tags. In tags, there is a column post_id and a column tag. My idea is to store each tag in a separate row. For instance, a post with id 1 and tags foo, bar and eggs would be stored in tags as
x
post_id | tag
---------------
1 | foo
1 | bar
1 | eggs
Which is the simplest way to get the id of a post with these three tags from the database? Thank you in advance!
Advertisement
Answer
You need aggregation.
If you want the post_id
s that have these 3 tags and no others:
SELECT post_id
FROM tags
GROUP BY post_id
HAVING SUM(tag IN ('foo', 'bar', 'eggs')) = 3 -- or COUNT(*) = 3
AND SUM(tag NOT IN ('foo', 'bar', 'eggs')) = 0
If you want the post_id
s that have these 3 tags and maybe other tags too then it is simpler:
SELECT post_id
FROM tags
WHERE tag IN ('foo', 'bar', 'eggs')
GROUP BY post_id
HAVING COUNT(*) = 3
I assume that each combination of post_id
and tag
is unique.