2013-08-02 126 views
0

我有一个类似于Getting data from multiple tables into single row while concatenating some values的问题,但我无法理解它,而我是一个新手是sql查询。我有很少的表,我必须加入他们,并连续获得一些连接的数据。说明是如下:我的Sql Group Concat返回重复行

 
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 我在那里创建了一个示例来演示我的问题。

回答

1

您可以使用DISTINCTGROUP_CONCAT像这里面:

GROUP_CONCAT(DISTINCT b.email SEPARATOR ',') AS member_emails 
+0

但是,这是不可能的名字。由于名字不能是唯一的..其实我已经显示逗号分隔的名称,如果名称是没有可用的电子邮件..是否有可能? –

+0

@ user2645698名称不唯一许多可以具有相同的名称。并在你的代码中,你已经公布了你应该使用不同的,因为马哈茂德告诉你 –

+0

@ user2645698 - 对不起,但我不明白你,你可以请一些额外的示例数据解释这个问题,你也可以更新[**此演示**](http://sqlfiddle.com/#!2/dd1d2/1)显示此问题。 –