sql >> Databasteknik >  >> RDS >> Mysql

MySQL ::Välj från kommaseparerad sträng

Det är bättre att normalisera ditt schema, lagra inte relationer i form av kommaseparerad lista istället skapa en kopplingstabell för detta som att behålla en m:m många till många relationer mellan användare och filter, skapa en ny tabell som user_filters med kolumner filter-id och användar-id och i varje rad spara en association per användare och filter som i din nuvarande schemarelation för filter 1 med många användare (1, '1, 2, 3') kommer att bli som

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

Exempelschema kommer att vara så här

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 ovanstående schema kan du enkelt fråga med join as, nedanstående fråga kan optimeras med hjälp av index

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

Exempeldemo

Om du inte kan ändra ditt schema och vill hålla fast vid det nuvarande kan du fråga enligt nedan men detta kan inte optimeras tillräckligt jämfört med ovanstående fråga

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

Exempeldemo

Databasnormalisering




  1. MySQL2 Ruby gem kommer inte att installera 10.6

  2. Hur tolkas sql med rekursivt uttalande?

  3. Felsökning av SQL Server Transactional Replikeringsproblem

  4. Beställ efter COUNT per värde