从多对多表中检索分组

时间:2012-02-06 19:20:37

标签: php mysql sql join

这很难解释,但我会尽我所能。

我有2张表与多对多的关系;有一个定义关系的链接表。这些表名为Question,QuestionTopic和Topic。主题包含TopicID和TopicName.Question字段,其字段为QuestionID和QuestionText。

我想检索主题列表和属于该主题的问题数量。但是,主题可以组合在一起,并且应该知道该组合特有的问题计数。举个例子:

主题|计数

主题1,主题2 | 10

主题1 | 3

主题2 | 2

以上暗示了topic1和10有3个独特的问题,其主题是Topic1和Topic2。剩下的两个问题有topic2。 我正在使用MySQL和PHP。感谢。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

你尝试过GROUP_CONCAT吗?

http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat

然后,您可以按主题ID分组。

答案 2 :(得分:1)

如上所述的GROUP_CONCAT将起作用。但另一方面,因为我发现你的数据库结构并不适合你的任务。看起来它太规范了,你需要做一些去规范化和迁移。

由于您有一组主题,我建议您再创建两个表: 1)主题组:组|主题 - 列出问题中主题的所有唯一组合(“组”)。 2)GroupQuestions:Group |问题 - 将问题与其涵盖的主题组相关联

然后,您的任务的解决方案将在GroupQuestions上逐个查询。