Mysql 使用逗号内的单个值连接字符串

Mysql 使用逗号内的单个值连接字符串,mysql,Mysql,我有一个名为toy table的表,它显示了处理的每种玩具类型的销售ID,不同的销售ID之间有逗号。请注意,我的数据模式不是这样的。但我在玩具层面上汇总数据,生成报告 |------------------------|------------------------| | Toy | IDs | |------------------------|------------------------| | Bu

我有一个名为toy table的表,它显示了处理的每种玩具类型的销售ID,不同的销售ID之间有逗号。请注意,我的数据模式不是这样的。但我在玩具层面上汇总数据,生成报告

|------------------------|------------------------|
|         Toy            |           IDs          |
|------------------------|------------------------|
|       Buzz Lightyear   |        22,33,44        |
|       Woody            |        24,41           |
|------------------------|------------------------|
我有另一个名为status table的表,它具有每个订单ID的状态

|------------------------|------------------------|
|         ID             |           Status       |
|------------------------|------------------------|
|       22               |        running         |
|       33               |        paused          |
|       44               |        running         |
|       24               |        cancelled       |
|       41               |        finished        |
|------------------------|------------------------|
我想通过一个连接创建一个表,其中可以有一个状态列,以逗号分隔,按销售ID的正确顺序排列,还可以有一个仅用于运行ID的列。它看起来是这样的:

|------------------------|------------------------|------------------------|-----------------------|
|         Toy            |           IDs          |         Status         |     Running IDs.      |
|------------------------|------------------------|------------------------|-----------------------|
|       Buzz Lightyear   |        22,33,44        |running, paused, running|     22,44             |
|       Woody            |        24,41           |   cancelled, finished  |                       |
|------------------------|------------------------|------------------------|-----------------------|
SELECT t.Toy,
       GROUP_CONCAT(o.ID ORDER BY o.ID) AS IDs,
       GROUP_CONCAT(s.Status ORDER BY s.ID) AS Status,
       GROUP_CONCAT(CASE WHEN s.Status = 'running' THEN s.ID END) AS `Running IDs`
FROM toys t
JOIN orders o ON o.Toy_ID = t.ID
JOIN status s ON s.ID = o.ID
GROUP BY t.Toy
我不知道如何加入。我已经试着通过find_in_set找到ID的位置,但是在那之后,我似乎无法继续前进。我必须报告玩具级别,以便在最终数据集中一行中不能有多个玩具

在进行聚合之前,需要进行连接。如果看不到表结构,很难100%确定,但是您想要的查询应该如下所示:

|------------------------|------------------------|------------------------|-----------------------|
|         Toy            |           IDs          |         Status         |     Running IDs.      |
|------------------------|------------------------|------------------------|-----------------------|
|       Buzz Lightyear   |        22,33,44        |running, paused, running|     22,44             |
|       Woody            |        24,41           |   cancelled, finished  |                       |
|------------------------|------------------------|------------------------|-----------------------|
SELECT t.Toy,
       GROUP_CONCAT(o.ID ORDER BY o.ID) AS IDs,
       GROUP_CONCAT(s.Status ORDER BY s.ID) AS Status,
       GROUP_CONCAT(CASE WHEN s.Status = 'running' THEN s.ID END) AS `Running IDs`
FROM toys t
JOIN orders o ON o.Toy_ID = t.ID
JOIN status s ON s.ID = o.ID
GROUP BY t.Toy

读取并修复架构。我的数据库没有删除列表。但当我在玩具层面上进行聚合时,我就得到了这样的结果。我使用group by toy和group_concatdistinct ids将状态表加入到您的语句中,并在statuses.id=toys.status上,因此每行都有一个标签。然后在状态标签处分组