2012-07-15 141 views
0

我有一個包含三個表的數據庫:questions,tags和questions_tags。這是他們如何設置:SQL Inner Join和Repeater

--------- 
questions 
--------- 
Question_ID 
Question_Title 
Content 

---- 
tags 
---- 
Tag_ID 
Tag_Title 

-------------- 
questions_tags 
-------------- 
Question_ID 
Tag_ID 

在我的程序中,我使用中繼器來顯示Question_Title和內容。我希望能夠重複Tag_Title(儘管有很多標籤也存在一定的問題)

本質上,我試圖重新創建類似於stackoverflow的問題塊(與問題,標籤,視圖等)

假設我有一個5個標籤的問題,該問題被插入到問題表中,連同一個ID(自動增量)和問題的內容,然後,如果用戶附加了任何標籤,那麼這些標籤將被放入帶關聯ID的標籤表中,然後questions_tags表將與Question_ID和Tag_ID匹配,因此它可能類似於:

Question_ID | Tag_ID 
    1  | 3 
    1  | 4 

所以問題1在這個例子中有兩個標籤。 那麼,我該如何讓中繼器在問題表中重複每個問題,然後重複與該問題相關的每個標籤?

我創建了一個視圖迄今其內部連接的問題,標籤和questions_tags,但重複它只是重複一個問題不止一次......

以下是我曾經爲參加完成:

SELECT q.Question_ID, qt.Tag_ID, t.Tag_Title, q.Question_Title, q.Content, q.Views 
FROM questions q 
INNER JOIN questions_tags qt 
ON q.Question_ID = qt.Question_ID 
Inner JOIN tags t 
ON qt.Tag_ID = t.Tag_ID 

或者,換句話說,我怎麼可能創建一個視圖與我的加入,使得它創建類似這樣的表格?:

Question_ID | Tag1 | Tag2 | Tag1_Title | Tag2_Title | Question_Title | Content 
+0

所以你基本上想創建一個視圖? – JackyBoi 2012-07-15 23:19:04

+0

是的,在我的帖子末尾有一個視圖設置,所以我可以輕鬆地用我的轉發器重複它。 – 2012-07-15 23:20:51

+1

您無法真正創建這樣的視圖,因爲不能保證每個問題的標籤數量相同,因此列數相同。我的應用程序中不使用中繼器,因此我無法專門回答如何使用中繼器執行此操作,但我會採用的方式是將數據加載到結構化的類層次結構中(問題包含標記的集合),然後根據需要呈現該層次結構(即單獨呈現標記)。 – 2012-07-15 23:23:29

回答

0

所以以後審查的所有提出的各種建議,我決定去與將數據加載到一個結構化的類層次結構的competent_tech的答案。我已經爲問題和標籤製作了一個類,其中一個問題類的參數是一個標籤列表。通過這條路線,我避免了需要創建任何視圖,並且能夠使用我的問題中最初陳述的表格。

謝謝大家的幫助。

0

我從你瞭解什麼問題是THA你試圖平息問題和標籤之間的關係。如果你使用的是mysql(假設你用mysql標記了你的問題),那麼你可以使用mysql的GROUP_CONCAT函數。像下面的東西應該會給你你正在尋找的東西。

SELECT q.Question_ID, q.Question_Title, GROUP_CONCAT(t.Tag_Title SEPARATOR ', ') AS 'Tags' 
FROM questions q 
INNER JOIN questions_tags qt 
ON q.Question_ID = qt.Question_ID 
INNER JOIN tags t 
ON qt.Tag_ID = t.Tag_ID 
GROUP BY q.Question_ID, q.q.Question_Title 

輸出看起來應該像下面這樣:

id  title tags 
1  quest1 tag1, tag2, tag3 
2  myquest anotherTag, anotherTag2 
+0

這種方法的問題是,您從結果中丟失了Tag_ID,如果它們提供超鏈接來定義標記或懸停時的工具提示,則可能需要這些Tag_ID。 – 2012-07-15 23:38:47

+0

@competent_tech,這就是問題所在,我需要這個Tag_ID,以便我可以在鏈接中使用它。 – 2012-07-15 23:40:33

+0

您可以更改適合需要的格式。如果它需要是一個鏈接,它可以在SQL中生成,如:GROUP_CONCAT(Concat('http ....',t.Tag_ID,'...',Tag_Title)...) – loopedcode 2012-07-15 23:40:38