Mysql
 sql >> Baza danych >  >> RDS >> Mysql

MySQL ::Wybierz z ciągu oddzielonego przecinkami

Lepiej jest znormalizować swój schemat, nie przechowuj relacji w formie listy oddzielonej przecinkami, zamiast tego utwórz tabelę połączeń, aby na przykład utrzymywać m:m wiele do wielu relacji między użytkownikami a filtrami, utwórz nową tabelę jako user_filters z kolumnami id filtru i id użytkownika iw każdym wierszu zapisz jedno powiązanie na użytkownika i filtruj jak w Twojej obecnej relacji schematu dla filtru 1 z wieloma użytkownikami (1, '1, 2, 3') stanie się jak

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

Przykładowy schemat będzie taki

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

Dla powyższego schematu możesz łatwo zapytać za pomocą join as, poniższe zapytanie można zoptymalizować za pomocą indeksów

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

Przykładowe demo

Jeśli nie możesz zmienić swojego schematu i chcesz pozostać przy bieżącym, możesz wykonać zapytanie jak poniżej, ale ten nie może być wystarczająco zoptymalizowany w porównaniu z powyższym zapytaniem

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

Przykładowe demo

Normalizacja bazy danych




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jeden do wielu MySQL

  2. Kopiuj/duplikuj bazę danych bez użycia mysqldump

  3. mysql 5.7 błąd log-slow-queries

  4. Czy przeniesienie danych z EBS do pamięci efemerycznych poprawi wydajność zapytań MySQL?

  5. Lista procedur/funkcji składowanych Wiersz poleceń Mysql