admin

MySQL选择定界数据

sql

我继承了一个表,其中包含有关某些人群的信息,其中一个字段包含定界数据,结果与另一张表匹配。

id_group     Name
-----------------------
1            2|4|5
2            3|4|6
3            1|2

在另一张表中,我列出了可能属于一个或多个组的人的列表

id_names     Names
-----------------------
1            Jack
2            Joe
3            Fred
4            Mary
5            Bill

我想对组数据执行选择,从而导致单个字段包含逗号或空格分隔的名称列表,例如“ Joe Fred Bill”上方的第一组行

我看过使用函数分割定界的字符串,还看过子查询,但是很快将子查询的结果连接起来变得非常庞大。

谢谢!


阅读 214

收藏
2021-07-01

共1个答案

admin

正如上面草莓的评论所暗示的,有一种方法可以做到这一点,但是它是如此丑陋。这就像用胶带完成昂贵的厨房装修一样。您应该对以这种方式设计数据库的人感到不满。

SELECT g.id_group, GROUP_CONCAT(n.Names SEPARATOR ' ') AS Names
FROM groups AS g JOIN names AS n
  ON FIND_IN_SET(n.id_names, REPLACE(g.Name, '|', ','))
GROUP BY g.id_group;

输出,在MySQL 5.6上测试:

+----------+---------------+
| id_group | Names         |
+----------+---------------+
|        1 | Joe Mary Bill |
|        2 | Fred Mary     |
|        3 | Jack Joe      |
+----------+---------------+

更好的解决方案是创建第三个表,其中您将组中的每个单独成员单独存储在一行中。也就是说,每组多行。

CREATE TABLE group_name (
  id_group INT NOT NULL,
  id_name INT NOT NULL,
  PRIMARY KEY (id_group, id_name)
);

然后,您可以以更简单的方式进行查询,并且有机会创建索引以使查询变得非常快。

SELECT id_group, GROUP_CONCAT(names SEPARATOR ' ') AS names
FROM groups
JOIN group_name USING (id_group)
JOIN names USING (id_name)
2021-07-01