Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL ::Seleziona da una stringa separata da virgole

È meglio normalizzare il tuo schema non memorizzare le relazioni sotto forma di elenco separato da virgole invece creare una tabella di giunzione per questo come mantenere un m:m relazione molti a molti tra utenti e filtri, creare una nuova tabella come user_filters con colonne filter id e user id e in ogni riga salva un'associazione per utente e filtra come nella relazione dello schema corrente per il filtro 1 con molti utenti (1, '1, 2, 3') diventerà come

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

Lo schema di esempio sarà così

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

Per lo schema sopra puoi facilmente eseguire query con join poiché, la query sottostante può essere ottimizzata utilizzando gli indici

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

Demo di esempio

Se non sei in grado di modificare il tuo schema e desideri rimanere con quello attuale, puoi eseguire una query come di seguito, ma questo non può essere ottimizzato abbastanza rispetto alla query precedente

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

Demo di esempio

Normalizzazione del database