Как присоединиться к tag_map в нормализованной базе данных - PullRequest
0 голосов
/ 15 декабря 2011

Рассмотрим стандартную нормализованную систему тегов «многие ко многим» (три таблицы статей, теги, tag_map).Я хочу получить список тегов с соответствующими статьями;например,

Tag    Article_IDs
tag1   1,5,7
tag2   3,4,5,7,8
.....

Как мне JOIN таблицы, чтобы создать этот список?

Наивный способ просто посчитать количество строк в tag_map WHERE tag = 'кое-что'.К сожалению, для этого метода нам нужен отдельный запрос для каждого тега.Например, чтобы сгенерировать список для 20 тегов, нам нужно 20 запросов (что не рационально).Я надеюсь сделать это один запрос с JOIN.

Ответы [ 3 ]

2 голосов
/ 15 декабря 2011

Вы можете сделать это с помощью функции агрегации group_concat . Их много в стеке потока.

SELECT tag.id,
 GROUP_CONCAT(post.post_id)
 FROM 
  posts 
  inner join 
  post_tag on ...
  inner join 
  tags on ...
 GROUP BY tag.id;
1 голос
/ 15 декабря 2011
Select t.Tag, Group_Concat(a.Article_ID)
From tag_map tm
Join tag t on tm.tag_id = t.tag_id
Join articles a on tm.article_id = a.article_id
Group By t.Tag
1 голос
/ 15 декабря 2011

Примерно так должно работать (но это только Oracle, я не знаю эквивалент wm_concat() в других базах данных):

select t.tagname, wm_concat(m.articleid) from tags t, tag_map m where t.id = m.tagid group by t.tagname;
...