sql >> Base de Datos >  >> RDS >> Mysql

MySQL ::Seleccione de una cadena separada por comas

Es mejor normalizar su esquema, no almacene relaciones en forma de lista separada por comas, en su lugar, cree una tabla de unión para mantener un m:m relación de muchos a muchos entre usuarios y filtros, cree una nueva tabla como user_filters con las columnas ID de filtro e ID de usuario y en cada fila guarde una asociación por usuario y filtre como en su relación de esquema actual para el filtro 1 con muchos usuarios (1, '1, 2, 3') se volverá como

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

El esquema de muestra será así

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')
;

Para el esquema anterior, puede consultar fácilmente con unirse como, la consulta a continuación se puede optimizar utilizando índices

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

Demostración de muestra

Si no puede modificar su esquema y quiere seguir con el actual, puede consultar como se muestra a continuación, pero este no se puede optimizar lo suficiente en comparación con la consulta anterior

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

Demostración de muestra

Normalización de bases de datos