Моя группа Sql Concat возвращает повторяющиеся строки

У меня проблема, похожая на получение данных из нескольких таблиц в одну строку при объединении некоторых значений, но я не могу этого понять, и я новичок в sql-запросах. У меня несколько таблиц, и я должен присоединиться к ним и получить несколько объединенных данных в ряд. Описание выглядит следующим образом:

Table 1 - tasks(id,title,user_id)
id     title          user_id     tree_id
--     -----          -------     -------
1      test task         1          20

Table 2 - task_follower(id,user_id,task_id)
id     user_id   task_id
--     -------   -------
1        1          1

Table 3 - account_user(id,name,email)
id      name    email
--      ----    -----
1       rakesh  [email protected]

Table 2 - category(id,category)
id     category
--     ------- 
1        Project1

Table 2 - task_category(id,user_id,task_id)
id     task_id   category_id
--     -------   -------
1        1          1

И запрос, который я выполняю:

    SELECT a.*, GROUP_CONCAT(b.name SEPARATOR ',') AS member_names, GROUP_CONCAT(b.email SEPARATOR ',') AS member_emails, GROUP_CONCAT(DISTINCT d.category) SEPARATOR ',') AS categories FROM tasks AS a INNER JOIN task_followers AS c ON a.id = c.task_id INNER JOIN account_user AS b ON c.user_id = b.id INNER JOIN task_category AS i ON a.id = i.task_id INNER JOIN category AS d ON i.category_id = d.id WHERE a.id = 1 AND a.user_id = 1 AND GROUP BY a.id

В результате этого запроса я получаю:

id    title       user_id   tree_id     member_names    member_emails
---   -----       -------   -------     -------------   -------------
1     test task      1        20        rakesh,rakesh   [email protected],[email protected]

Я не могу понять, почему дублируются имя и адрес электронной почты? Пожалуйста, помогите мне решить эту проблему, а также не могли бы вы объяснить мне, в чем я ошибся концептуально?

Я заметил, что эта проблема возникает, когда количество категорий, связанных с задачей, больше единицы. Взгляните на http://sqlfiddle.com/#!2/b96eb/1 Я создал там пример, чтобы продемонстрировать мою проблему.


person Raakesh Kumar    schedule 02.08.2013    source источник


Ответы (1)


Вы можете использовать DISTINCT внутри _2 _ вот так:

GROUP_CONCAT(DISTINCT b.email SEPARATOR ',') AS member_emails 
person Mahmoud Gamal    schedule 02.08.2013
comment
Но это невозможно с именем .. Потому что имя не может быть уникальным .. На самом деле я должен отображать имена, разделенные запятыми, и если имя недоступно, то электронная почта .. Возможно ли? - person Raakesh Kumar; 02.08.2013
comment
@ user2645698 имя не уникально, многие могут иметь одно и то же имя. и в вашем коде вы его дублировали, и вы должны использовать его отдельно, как сказал вам Махмуд - person echo_Me; 02.08.2013
comment
@ user2645698 - Извините, но я вас не понимаю. Не могли бы вы опубликовать дополнительные образцы данных, объясняющие эту проблему, вы также можете обновить эта демонстрация, показывающая эту проблему. - person Mahmoud Gamal; 02.08.2013
comment
Я понимаю, что вы говорите .. Хорошо, позвольте мне выразиться так: скажем, есть два пользователя User1 ‹[email protected]› и User1 ‹[email protected]› Теперь, если я приглашаю их обоих, а затем отображаю их имена, используя DISTINCT, он не будет работать должным образом. Так что я тоже должен заняться этим вопросом. - person Raakesh Kumar; 02.08.2013
comment
@ user2645698 - Вы имеете в виду, что у пользователя может быть несколько писем? а вам нужно выбрать только один емайл? не могли бы вы обновить свой вопрос, добавив в него полные образцы данных, объясняющих эту проблему, с желаемым результатом? это будет очень полезно. Спасибо. - person Mahmoud Gamal; 02.08.2013
comment
@ user2645698 - Добавьте DISTINCT см. эту обновленную демонстрацию - person Mahmoud Gamal; 02.08.2013