I have three tables: 1.article – 2.tag – 3.article_has_tags (An article may have many tags).
article:
id | title 1 | A1 2 | A2 3 | A3
tag:
id | title 1 | T1 2 | T2 3 | T3
article_has_tags: (it contents article & tag primary keys)
aid | tid 1 | 1 1 | 2 1 | 3 2 | 1 3 | 2
I need to return the first three articles with all their tags.
My query is:
SELECT article.id, article.title, tag.title FROM article JOIN article_has_tags ON (article.id = article_has_tags.aid) JOIN tag ON (article_has_tags.tid = tag.id) ORDER BY article.id limit 3
But obviously it’s returning:
article.id | article.title | tag.title 1 | A1 | T1 1 | A1 | T2 1 | A1 | T3
The result I need is something like this:
article.id | article.title | tag.title 1 | A1 | T1-T2-T3 2 | A2 | T1 3 | A3 | T2
How can I get the result I need? Thank you.
Advertisement
Answer
you can use group_concat
in MySQL. Here is the demo.
SELECT article.id, article.title, group_concat(tag.title SEPARATOR '-') as tag FROM article JOIN article_has_tags ON (article.id = article_has_tags.aid) JOIN tag ON (article_has_tags.tid = tag.id) GROUP BY article.id, article.title ORDER BY article.id
Output:
*-------------------* | id title tag | *-------------------* 1 A1 T3-T1-T2 2 A2 T1 3 A3 T2 *-------------------*