Mysql
 sql >> база данни >  >> RDS >> Mysql

MySQL ::Изберете от разделен със запетая низ

По-добре е да нормализирате вашата схема, не съхранявайте релациите под формата на списък, разделен със запетая, вместо да създайте таблица за свързване за това, като например да поддържате m:m много към много връзка между потребители и филтри, създайте нова таблица като user_filters с колони филтър идентификатор и потребителски идентификатор и във всеки ред запишете по една асоциация на потребител и филтър, както във вашата текуща схема на релация за филтър 1 с много потребители (1, '1, 2, 3') ще стане като

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

Примерната схема ще бъде следната

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

За горната схема можете лесно да правите заявка с присъединяване, тъй като заявката по-долу може да бъде оптимизирана с помощта на индекси

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

Примерна демонстрация

Ако не можете да промените схемата си и искате да се придържате към текущата, можете да направите заявка по-долу, но тази не може да бъде достатъчно оптимизирана в сравнение с горната заявка

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

Примерна демонстрация

Нормализация на базата данни




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как работи функцията REGEXP_SUBSTR() в MySQL

  2. Как мога да използвам mySQL replace() за заместване на низове в множество записи?

  3. Бройте главни букви в низ

  4. Вмъкване в база данни (mysql) с помощта на Ajax и PHP

  5. Импортирайте SQL файл в mysql