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 kannselect 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