I have a posts table where tags are saved in another table. And the structure is as following.
POSTS table
| ID | TITLE |
|---|---|
| 101 | Something related to AUSTRALIA and CRICKET |
| 102 | Something related to INDIA and CRICKET |
| 103 | Something related to CRICKET ALONE |
| 104 | Something related to INDIA ALONE |
TAGS table
| ID | POSTS_ID | TAG_NAME |
|---|---|---|
| 1001 | 101 | CRICKET |
| 1002 | 101 | AUSTRALIA |
| 1003 | 102 | CRICKET |
| 1004 | 102 | INDIA |
| 1005 | 103 | CRICKET |
| 1006 | 104 | INDIA |
Is there any way we can get the posts_id based on the combination of tags ? For example, I would like to get the posts_id where tags CRICKET & INDIA is present.
expected result:
| ID | TITLE |
|---|---|
| 102 | Something related to INDIA and CRICKET |
the table have approximately a million records. So the query has to be optmised.
Its a bit tricky for me to solve this. I would be really thankful if someone can help me on this.
CodePudding user response:
You can simply do it like this:
Select POSTS.* From POSTS
INNER JOIN TAGS on POSTS.ID = TAGS.POSTS_ID
where TAGS.TAG_NAME LIKE '%INDIA%' OR TAGS.TAG_NAME LIKE '%CRICKET%'
you can modify where clause, this is based on what I understood from your question
CodePudding user response:
So I think I have found the answer.
select posts.id, posts.title from posts
join (
select posts_id from post_tags
where TAG_NAME in ('INDIA','CRICKET')
group by posts_id
having count(DISTINCT(TAG_NAME)) > 1
) as c_post_tags
on posts.id = c_post_tags.posts_id
And I have made the post_tags.TAG_NAME as an INDEX. so that the performance is much faster.
Thank you all for your efforts
