Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySQL ::Sélectionnez une chaîne séparée par des virgules

Il est préférable de normaliser votre schéma ne stockez pas les relations sous forme de liste séparée par des virgules créez plutôt une table de jonction pour cela comme pour maintenir un m:m relation plusieurs à plusieurs entre les utilisateurs et les filtres, créez une nouvelle table en tant que user_filters avec les colonnes filter id et user id et dans chaque ligne enregistrez une association par utilisateur et filtrez comme dans votre relation de schéma actuelle pour le filtre 1 avec de nombreux utilisateurs (1, '1, 2, 3') deviendra comme

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

L'exemple de schéma ressemblera à ceci

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

Pour le schéma ci-dessus, vous pouvez facilement interroger avec join as, la requête ci-dessous peut être optimisée à l'aide d'index

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

Exemple de démonstration

Si vous n'êtes pas en mesure de modifier votre schéma et que vous souhaitez vous en tenir à celui actuel, vous pouvez interroger comme ci-dessous, mais celui-ci ne peut pas être suffisamment optimisé par rapport à la requête ci-dessus

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

Exemple de démonstration

Normalisation de la base de données