Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MySQL ::Selecione a partir de uma string separada por vírgulas


É melhor normalizar seu esquema, não armazene relações em forma de lista separada por vírgulas, em vez disso, crie uma tabela de junção para isso, como manter um m:m muitos para muitos relação entre usuários e filtros, crie uma nova tabela como user_filters com colunas filter id e user id e em cada linha salve uma associação por usuário e filtre como em sua relação de esquema atual para o filtro 1 com muitos usuários (1, '1, 2, 3') vai se tornar como
filter id user id
    (1, '1'),
    (1, '2'),
    (1, '3'),

O esquema de amostra será assim
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 o esquema acima, você pode consultar facilmente com join, pois a consulta abaixo pode ser otimizada usando índices
select u.* 
from users u
join user_filters uf on(uf.u_id = u.id)
 where uf.fid =1

Exemplo de demonstração


Se você não conseguir alterar seu esquema e quiser manter o atual, você pode consultar como abaixo, mas este não pode ser otimizado o suficiente para comparar com a consulta acima
select u.* 
from users u
join filters f on(find_in_set(u.id,replace(`u_ids`,' ','')) > 0)
 where f.id =1 

Exemplo de demonstração

Normalização de banco de dados