Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 合并到一个具有相同id或属性的组SQL group_concat donds';没有帮助:(_Mysql_Sql_Group By_Inner Join_Group Concat - Fatal编程技术网

Mysql 合并到一个具有相同id或属性的组SQL group_concat donds';没有帮助:(

Mysql 合并到一个具有相同id或属性的组SQL group_concat donds';没有帮助:(,mysql,sql,group-by,inner-join,group-concat,Mysql,Sql,Group By,Inner Join,Group Concat,如果行具有相同的id或相同的属性,我需要将它们分组在一行中。因此,我假设我需要使用内部连接和组连接,但我不知道如何进行。问题是,如果两个用户没有公共属性,但与同一个第三个用户属于同一组,那么这三个用户必须合并到一个组中。我也不知道“表中没有组id列。” group_id, user_id, group_attributes 1, 1, "red, green, yellow, grey, purple, coffeemaker" 1, 2, "red, green,

如果行具有相同的id或相同的属性,我需要将它们分组在一行中。因此,我假设我需要使用
内部连接
组连接
,但我不知道如何进行。问题是,如果两个用户没有公共属性,但与同一个第三个用户属于同一组,那么这三个用户必须合并到一个组中。我也不知道“表中没有
组id
列。”

group_id, user_id, group_attributes
1, 1, "red, green, yellow, grey, purple, coffeemaker"
1, 2, "red, green, yellow, grey, purple, coffeemaker"
1, 3, "red, green, yellow, grey, purple, coffeemaker"
1, 4, "red, green, yellow, grey, purple, coffeemaker"
1, 5, "red, green, yellow, grey, purple, coffeemaker"
2, 6, "coffee, milk, croissant"
2, 7, "coffee, milk, croissant"
2, 8, "coffee, milk, croissant"
原始数据,以减少您的回答时间

CREATE TABLE task (
    user_id INT(10) NOT NULL,
    attribute VARCHAR(50) NULL DEFAULT NULL);
INSERT INTO task (user_id, attribute)
VALUES
(1, 'red'),
(1, 'green'),
(2, 'green'),
(2, 'yellow'),
(3, 'grey'),
(3, 'coffeemaker'),
(4, 'grey'),
(4, 'purple'),
(5, 'purple'),
(5, 'red'),
(6, 'black'),
(7, 'black'),
(7, 'milk'),
(8, 'milk'),
(8, 'croissant');


这是一个图遍历问题,因此简单的
连接
是不够的。一种方法是让所有属性与给定属性关联。下面的递归CTE可以做到这一点:

with recursive aa as (
      select distinct t1.attribute as at1, t2.attribute as at2
      from task t1 join
           task t2
           on t1.user_id = t2.user_id
     ),
     cte as (
      select at1, at2, at1 as found, 1 as lev
      from aa
      union all
      select cte.at1, aa.at2, concat_ws(',', found, aa.at2), lev + 1
      from cte join
           aa
           on cte.at2 = aa.at1
      where find_in_set(aa.at2, found) = 0 
     )
select distinct at1, at2
from cte;
然后,可以使用相同的递归CTE将值组合成字符串:

with recursive aa as (
      select distinct t1.attribute as at1, t2.attribute as at2
      from task t1 join
           task t2
           on t1.user_id = t2.user_id
     ),
     cte as (
      select at1, at2, at1 as found, 1 as lev
      from aa
      union all
      select cte.at1, aa.at2, concat_ws(',', found, aa.at2), lev + 1
      from cte join
           aa
           on cte.at2 = aa.at1
      where find_in_set(aa.at2, found) = 0 
     )
select dense_rank() over (order by pairs.all_attributes) as group_id, t.user_id, pairs.all_attributes
from (select at1, group_concat(at2) as all_attributes
      from cte
      group by at1
     ) pairs join
     (select user_id, min(attribute) as min_attribute
      from task
      group by user_id
     ) t
     on t.min_attribute = pairs.at1;
我看不出这段代码有什么问题。但是dbfiddle坚持要为
创建一个十六进制字符串。但是,我认为这将在您的数据库上起作用。下面是示例