sql >> Databáze >  >> RDS >> Mysql

MySQL ::Vyberte z řetězce odděleného čárkou

Je lepší normalizovat vaše schéma, neukládat vztahy ve formě seznamu odděleného čárkami, místo toho vytvořit spojovací tabulku, abyste zachovali m:m mnoho až mnoho vztahů mezi uživateli a filtry, vytvořte novou tabulku jako user_filters se sloupci id filtru a id uživatele a v každém řádku uložte jedno přidružení na uživatele a filtrujte jako ve vašem aktuálním vztahu schématu pro filtr 1 s mnoha uživateli (1, '1, 2, 3') bude jako

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

Ukázkové schéma bude vypadat takto

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

Pro výše uvedené schéma můžete snadno dotazovat pomocí spojení jako, níže uvedený dotaz lze optimalizovat pomocí indexů

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

Ukázka ukázky

Pokud nejste schopni změnit své schéma a chcete se držet aktuálního, můžete dotazovat jako níže, ale toto nelze dostatečně optimalizovat ve srovnání s dotazem výše

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

Ukázka ukázky

Normalizace databáze




  1. Jak vypsat všechny uložené procedury v MariaDB

  2. Zobrazuji obrázek z databáze PostgreSQL, bytea

  3. Tabulkový prostor SYSMGMTDATA je PLNÝ v úložišti správy infrastruktury Grid (MGMTDB)

  4. Omezit číslo stránky stránkování