我继承了一个表,其中包含有关某些人群的信息,其中一个字段包含定界数据,结果与另一张表匹配。
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”上方的第一组行
我看过使用函数分割定界的字符串,还看过子查询,但是很快将子查询的结果连接起来变得非常庞大。
谢谢!
正如上面草莓的评论所暗示的,有一种方法可以做到这一点,但是它是如此丑陋。这就像用胶带完成昂贵的厨房装修一样。您应该对以这种方式设计数据库的人感到不满。
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)