Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL ::Aus kommagetrennter Zeichenfolge auswählen

Es ist besser, Ihr Schema zu normalisieren, Beziehungen nicht in Form einer kommagetrennten Liste zu speichern, sondern eine Verbindungstabelle dafür zu erstellen, um ein m:m zu verwalten viele-zu-viele-Beziehungen zwischen Benutzern und Filtern, erstellen Sie eine neue Tabelle als user_filters mit den Spalten filter id und user id und speichern Sie in jeder Zeile eine Zuordnung pro Benutzer und filtern Sie wie in Ihrer aktuellen Schemabeziehung für Filter 1 mit vielen Benutzern (1, '1, 2, 3') wird wie

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

Beispielschema wird wie folgt aussehen

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

Für das obige Schema können Sie einfach mit Join abfragen, wie unten die Abfrage mit Indizes

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

Beispieldemo

Wenn Sie Ihr Schema nicht ändern können und beim aktuellen bleiben möchten, können Sie wie unten abfragen, aber diese kann im Vergleich zur obigen Abfrage nicht optimiert genug sein

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

Beispieldemo

Datenbanknormalisierung