Извлечение групп из таблиц "многие ко многим" - PullRequest
3 голосов
/ 06 февраля 2012

Это довольно сложно объяснить, но я сделаю то, что могу.

У меня есть 2 таблицы с отношением "многие ко многим";есть таблица ссылок, определяющая отношения.Эти таблицы называются Question, QuestionTopic и Topic.Тема имеет поля TopicID и TopicName.Question имеет поля QuestionID и QuestionText.

Я хочу получить список тем и количество вопросов, относящихся к этой теме.Тем не менее, темы могут быть сгруппированы, и число вопросов, уникальных для этой комбинации, должно быть известно.Как пример:

Тема (ы) |Количество

Тема1, Тема2 |10

Тема1 |3

Тема2 |2

Вышесказанное подразумевает, что есть 3 вопроса, уникальных для theme1 и 10, которые имеют темы Topic1 и Topic2.Остальные 2 вопроса имеют тему2.Я использую MySQL и PHP.Спасибо.

Ответы [ 3 ]

3 голосов
/ 06 февраля 2012

«Обманывающий» раствор, используя 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 голос
/ 07 февраля 2012

GROUP_CONCAT, как указано выше, будет работать. Но с другой стороны, как я вижу, ваша структура базы данных не совсем соответствует вашей задаче. Похоже, он слишком нормализован, и вам нужно выполнить некоторую ненормализацию и миграцию.

Поскольку у вас есть группы тем, я предлагаю вам создать еще две таблицы: 1) TopicGroups: Группа | Тема - перечислить все уникальные комбинации («группы») тем в вопросах. 2) GroupQuestions: Группа | Вопрос - чтобы связать вопрос с группой тем, которые он охватывает

Тогда решение для вашей задачи будет простым группированием по запросу на GroupQuestions.

1 голос
/ 06 февраля 2012

ты пробовал GROUP_CONCAT?

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

тогда вы можете группировать по идентификатору темы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...