Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

MySQL chọn dữ liệu phân tách

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)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Thiếu giá trị cho id khóa chính Doctrine Symfony2

  2. tìm kiếm từ nhiều bảng bằng cách sử dụng một từ khóa trong mysql

  3. Django - Làm thế nào để liên kết với cơ sở dữ liệu kế thừa thông qua trung gian?

  4. mysql Đếm nhiều lần xuất hiện của các mục được ghép

  5. Làm thế nào để có được bản ghi khác biệt từ bảng mysql?