交叉表和查询以及MySQL

时间:2011-11-26 15:55:50

标签: mysql

我正在建立一个StackOverflow迷你克隆。我有以下数据库关系:

questions 
- question_id
- title

tags
- tag_id
- name

question_tags
- foreign key tag_id
- foreign key question_id

据说,这是组织标记系统的正确方法。

现在,如何使用标记' java'查询所有问题,同时,在列出这些问题时,还会显示所有标记每个问题都与相关联?

我觉得非正规化并在问题中添加一个额外的字段,比如说 tag_string ,其中标签列表为CSV ,所以对于这种情况,我可以有一个更简单的查询。

当然,在显示单个问题时,这不是问题:

  SELECT * FROM questions LEFT OUTER JOIN question_tags USING(question_id)
                          LEFT OUTER JOIN tags USING(tag_id)
                          WHERE question_id = 42;

2 个答案:

答案 0 :(得分:0)

不完全确定,但您可以考虑在子查询中使用CONCAT()来组合所有这些。可能不是很好的表现

-edit -

Using GROUP_CONCAT on subquery in MySQL上接受的答案可能对您有帮助。

答案 1 :(得分:0)

结束了一个如下所示的解决方案:

    result = g.db.query(u" SELECT q.*, u.fullname, u.reputation, t2.tag_id, t2.name as tag_name, a.answer_id, qv.vote_id, qv.value as vote_value \
                       FROM tags t \
                       JOIN question_tags USING(tag_id) \
                       JOIN questions q USING(question_id) \
                       JOIN users u ON(q.author_id = u.user_id) \
                       JOIN question_tags qt2 ON(qt2.question_id = q.question_id) \
                       JOIN tags t2 ON(t2.tag_id = qt2.tag_id) \
                       LEFT OUTER JOIN answers a ON (a.question_id = q.question_id) \
                       LEFT OUTER JOIN question_votes qv ON (qv.question_id = q.question_id) \
                       WHERE (t.name = %s);", name)

不知怎的,我错过了这样一个事实,即可以在同一个表上连接两次 - 首先是匹配标签,后来是每个问题的所有标签。