Như ngụ ý trong bình luận của Strawberry ở trên, có một cách để làm điều này, nhưng nó quá xấu xí. Nó giống như hoàn thành việc sửa sang lại nhà bếp đắt tiền của bạn bằng cách sử dụng băng keo. Bạn sẽ cảm thấy bất bình với người đã thiết kế cơ sở dữ liệu theo cách này.
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;
Đầu ra, được thử nghiệm trên MySQL 5.6:
+----------+---------------+
| id_group | Names |
+----------+---------------+
| 1 | Joe Mary Bill |
| 2 | Fred Mary |
| 3 | Jack Joe |
+----------+---------------+
Sự phức tạp của truy vấn này và thực tế là nó sẽ buộc phải quét bảng và không thể được tối ưu hóa, sẽ thuyết phục bạn về có vấn đề gì với việc lưu trữ danh sách id trong một chuỗi phân cách .
Giải pháp tốt hơn là tạo một bảng thứ ba, trong đó bạn lưu trữ từng thành viên riêng lẻ của nhóm trên một hàng của chính nó. Có nghĩa là, nhiều hàng cho mỗi nhóm.
CREATE TABLE group_name (
id_group INT NOT NULL,
id_name INT NOT NULL,
PRIMARY KEY (id_group, id_name)
);
Sau đó, bạn có thể truy vấn theo cách đơn giản hơn và bạn có cơ hội tạo chỉ mục để thực hiện truy vấn rất nhanh.
SELECT id_group, GROUP_CONCAT(names SEPARATOR ' ') AS names
FROM groups
JOIN group_name USING (id_group)
JOIN names USING (id_name)