我正在建立一个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;
答案 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)
不知怎的,我错过了这样一个事实,即可以在同一个表上连接两次 - 首先是匹配标签,后来是每个问题的所有标签。