MySQL逗号分隔值

3

我有两个表格,类似于下面的表格1和表格2。我想要一个类似于表格3的输出结果。

  Table 1

ParticipantsId | Description | Duration
1,2                 Demo        60 mins
1                   Test        25 mins
1,2,3,4             Alpha       30 mins
4,5,6,2             MCQ         120 mins

表格2

UserId |  Name   |  Age
  1       Aku        21
  2       Greg       18
  3       Denver     24
  4       Mike       22
  5       Sid        24
  6       Sriten     19 

我希望输出结果如下:

表格3

users                   | Description | Duration
Aku,Greg                   Demo          60
Aku                        Test          25
Aku,Greg,Denver,Mike       Alpha         30
Mike,Sid,Sriten,Greg       MCQ           120  

我尝试了find_by_set、group和其他各种可能性,但是我无法获得所需的结果,请帮忙。


3
答案是不要将数据存储为逗号分隔值。这样做只会给你带来很多麻烦。 - jarlh
@jarlh,这个问题没有解决方案吗? - Raja Dhasan
抱歉,我不会碰那个混乱的代码... - jarlh
1个回答

4

您可以同时使用GROUP_CONCAT()FIND_IN_SET()

SELECT
    GROUP_CONCAT(t2.`name`) AS users,
    t1.Description,
    CAST(t1.Duration AS UNSIGNED) AS Duration
FROM
    table1 t1,
    table2 t2
WHERE
    FIND_IN_SET(t2.userID, t1.ParticipantsId)
GROUP BY
    t1.Description,
    CAST(t1.Duration AS UNSIGNED)

结果是:

+----------------------+-------------+----------+
| users                | Description | Duration |
+----------------------+-------------+----------+
| Greg,Denver,Aku,Mike | Alpha       |       30 |
| Greg,Aku             | Demo        |       60 |
| Greg,Mike,Sid,Sriten | MCQ         |      120 |
| Aku                  | Test        |       25 |
+----------------------+-------------+----------+
4 rows in set

然而,您必须考虑数据结构的规范化。正如之前有人提到的那样,逗号分隔值是一种不好的做法。


2
此查询针对 SQL 标准,只有在未设置完整分组的 SQL 模式时才能运行。然而,在新版本的 MySQL 中,默认情况下已经设置了该模式。 - Shadow
@Shadow,完全同意,但是没有任何标准方法可以使用来“连接”这些表。 - mitkosoft
2
不,我不是在说连接(join),我是在说分组(group by)。连接(join)使用MySQL函数来解决问题。然而,在分组(group by)中,你只列出了描述(description),但没有时长(duration)。 - Shadow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接