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

MySQL избира данни с разделители

Както се подразбира от коментара на Strawberry по-горе, има начин да се направи това, но е толкова грозен. Това е като да завършите скъпия си ремонт на кухня с помощта на тиксо. Трябва да изпитвате негодувание към човека, който е проектирал базата данни по този начин.

SELECT g.id_group, GROUP_CONCAT(n.Names SEPARATOR ' ') AS Names
FROM groups AS g JOIN names AS n
  ON FIND_IN_SET(n.id_names, REPLACE(g.Name, '|', ','))
GROUP BY g.id_group;

Изход, тестван на MySQL 5.6:

+----------+---------------+
| id_group | Names         |
+----------+---------------+
|        1 | Joe Mary Bill |
|        2 | Fred Mary     |
|        3 | Jack Joe      |
+----------+---------------+

Сложността на тази заявка и фактът, че тя ще бъде принудена да направи сканиране на таблица и не може да бъде оптимизирана, трябва да ви убеди в какво не е наред със съхраняването на списък с идентификатори в разделен низ .

По-доброто решение е да създадете трета таблица, в която да съхранявате всеки отделен член на групата на един ред. Тоест няколко реда на група.

CREATE TABLE group_name (
  id_group INT NOT NULL,
  id_name INT NOT NULL,
  PRIMARY KEY (id_group, id_name)
);

След това можете да правите заявки по по-опростен начин и имате възможност да създавате индекси, за да направите заявката много бърза.

SELECT id_group, GROUP_CONCAT(names SEPARATOR ' ') AS names
FROM groups
JOIN group_name USING (id_group)
JOIN names USING (id_name)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Използване на псевдоним на колона в същата клауза SELECT

  2. Динамично създаване на колони от данни за редове с помощта на Select in Bigquery

  3. SQL:Сравняване на два броя от различни таблици

  4. mysql вмъкване в таблица, ако съществува

  5. MySQL - сортиране на разделен със запетая низ в колона