2011-11-26 70 views
0

我正在構建一個StackOverflow迷你克隆。我有以下數據庫關係:交集表和查詢和MySQL

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

結束了,看起來像這樣的解決方案:

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) 

不知怎的,我錯過了一個事實,即有可能在同一個表連接兩次 - 第一個匹配的標籤,後來爲每個所有標籤題。

0

不能完全確定,但可以考慮在子查詢中使用CONCAT()到所有這些結合起來。性能可能不是很好

CNC中

Using GROUP_CONCAT on subquery in MySQL接受的答案可以幫助你。