2012-02-06 105 views
3

這是很難解釋的,但我會盡我所能。從多對多表中檢索分組

我有兩個表,多對多的關係;有一個定義關係的鏈接表。這些表格被命名爲Question,QuestionTopic和Topic。主題包含字段TopicID和TopicName.Question包含字段QuestionID和QuestionText。

我想檢索主題列表以及屬於該主題的問題數量。但是,可以將主題組合在一起,並且應該知道該組合所特有的問題計數。舉個例子:

主題|計數

Topic1,Topic2 | 10

主題1 | 3

主題2 | 2

以上意味着有3個題目Topic1和Topic2獨有的問題。剩下的2個問題有topic2。 我正在使用MySQL和PHP。謝謝。

+0

哦,這是一個非常有趣而且很難回答的問題。 – 2012-02-06 19:39:57

回答

3

「作弊」解決方案,使用GROUP_CONCAT()。這不會顯示與任何主題無關的問題的計數:

SELECT 
     TopicIds 
    , COUNT(*) AS QuestionCount 
FROM 
     (SELECT 
       QuestionId 
      , GROUP_CONCAT(TopicId ORDER BY TopicId) AS Topics 
     FROM 
       QuestionTopic 
     GROUP BY 
       QuestionId 
    ) AS grp 
GROUP BY 
     Topics 
+0

感謝這很好,因爲問題必須與一個主題相關。我不知道關於group_concat。 – 2012-02-06 21:11:13

1

GROUP_CONCAT如上所述將工作。但另一方面,我看到你的數據庫結構並不適合你的任務。看起來它太正常了,你需要做一些去規範化和遷移。

既然你有一組主題,我建議你創建兩個表: 1)TopicGroups:Group |主題 - 列出問題中所有主題的唯一組合(「組」)。 2)GroupQuestions:Group |問題 - 將問題與其涵蓋的主題組相關聯

然後,針對您的任務的解決方案將通過GroupQuestions上的查詢進行簡單分組。

+0

我將如何填充這些表格以及我應該在什麼時候執行它?看起來好像很多維護。 – 2012-02-06 20:53:20

+0

初始遷移 - 您需要編寫代碼。也許一些存儲過程。它不是一個簡單的更新/插入的東西。然後,當您插入原始表格時,您需要插入這些新表格 - 即您需要編寫觸發器或更改應用程序。但是回報會很大 - 解決方案的性能會更好。對於非標準化解決方案,成本通常是:1)可能存在數據完整性問題; 2)插入速度較慢; 3)插入代碼更復雜。 – 2012-02-07 00:00:06