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

MySQL ::Chọn từ chuỗi được phân tách bằng dấu phẩy

Tốt hơn hết để chuẩn hóa lược đồ của bạn không lưu trữ các quan hệ dưới dạng danh sách được phân tách bằng dấu phẩy thay vào đó hãy tạo một bảng nối để duy trì m:m nhiều mối quan hệ giữa người dùng và bộ lọc, hãy tạo một bảng mới dưới dạng user_filters với id bộ lọc cột và id người dùng và trong mỗi hàng lưu một liên kết cho mỗi người dùng và lọc giống như trong quan hệ giản đồ hiện tại của bạn cho bộ lọc 1 với nhiều người dùng (1, '1, 2, 3') sẽ trở nên giống như

filter id user id
    (1, '1'),
    (1, '2'),
    (1, '3'),

Lược đồ mẫu sẽ như thế này

CREATE TABLE user_filters
    (`fid` int, `u_id` varchar(50))
;

INSERT INTO user_filters
    (`fid`, `u_id`)
VALUES
    (1, '1'),
    (1, '2'),
    (1, '3'),
    (2, '5'),
    (2, '5')
;

CREATE TABLE filters
    (`id` int, `title` varchar(50))
;

INSERT INTO filters
    (`id`, `title`)
VALUES
    (1, 'test'),
    (2, 'test 1')
;


CREATE TABLE users
    (`id` int, `name` varchar(6))
;

INSERT INTO users
    (`id`, `name`)
VALUES
    (1, 'Tom'),
    (2, 'Tim'),
    (3, 'Sue'),
    (4, 'Bruce'),
    (5, 'Ann'),
    (6, 'George')
;

Đối với lược đồ trên, bạn có thể dễ dàng truy vấn với tham gia như, truy vấn dưới đây có thể được tối ưu hóa bằng cách sử dụng các chỉ mục

select u.* 
from users u
join user_filters uf on(uf.u_id = u.id)
 where uf.fid =1

Bản trình diễn mẫu

Nếu bạn không thể thay đổi lược đồ của mình và muốn tiếp tục với lược đồ hiện tại, bạn có thể truy vấn như bên dưới nhưng lược đồ này không thể đủ tối ưu hóa so với truy vấn ở trên

select u.* 
from users u
join filters f on(find_in_set(u.id,replace(`u_ids`,' ','')) > 0)
 where f.id =1 

Bản trình diễn mẫu

Chuẩn hóa cơ sở dữ liệu




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL chọn hàng ngẫu nhiên với JOIN từ hai bảng

  2. Làm cách nào để tôi có thể thay đổi varchar đã lập chỉ mục (255) từ utf8 thành utf8mb4 mà vẫn duy trì độ dài khóa tối đa là 767?

  3. Cách hoạt động của toán tử SOUNDS LIKE trong MySQL

  4. Thực hiện theo thiết kế bảng cơ sở dữ liệu người dùng

  5. Không thể kết nối với máy chủ mysql trên AWS RDS