sql >> Database teknologi >  >> RDS >> Mysql

MySQL ::Vælg fra kommasepareret streng

Det er bedre at normalisere dit skema, lad være med at gemme relationer i form af kommasepareret liste i stedet for at oprette en forbindelsestabel til dette, for at opretholde en m:m mange til mange forhold mellem brugere og filtre, opret en ny tabel som user_filters med kolonner filter-id og bruger-id og i hver række gem en tilknytning pr. bruger og filter som i din nuværende skemarelation for filter 1 med mange brugere (1, '1, 2, 3') bliver som

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

Eksempelskema vil være sådan her

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

For ovenstående skema kan du nemt forespørge med join som, nedenstående forespørgsel kan optimeres ved hjælp af indekser

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

Eksempeldemo

Hvis du ikke er i stand til at ændre dit skema og vil holde dig til det nuværende, kan du forespørge som nedenfor, men dette kan ikke optimeres nok sammenlignet med ovenstående forespørgsel

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

Eksempeldemo

Databasenormalisering




  1. phpMyAdmin kaster en #2002 kan ikke logge ind på mysql serveren phpmyadmin

  2. Sådan prætificerer du JSON-formaterede forespørgselsresultater i SQLcl (Oracle)

  3. Sådan konfigureres en PDO-forbindelse korrekt

  4. Sådan tilføjes 1 til værdien af ​​en kolonne i en eksisterende række i mysql