sql >> Databáze >  >> RDS >> Mysql

MySQL vybírá data s oddělovači

Jak vyplývá z výše uvedeného komentáře Strawberry, existuje způsob, jak to udělat, ale je to tak ošklivé. Je to jako dokončit svou nákladnou přestavbu kuchyně pomocí lepicí pásky. Měli byste cítit odpor k osobě, která navrhla databázi tímto způsobem.

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;

Výstup, testováno na MySQL 5.6:

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

Složitost tohoto dotazu a skutečnost, že bude nucen provést skenování tabulky a nelze jej optimalizovat, by vás měla přesvědčit o co je špatného na ukládání seznamu ID do odděleného řetězce .

Lepším řešením je vytvoření třetí tabulky, do které uložíte každého jednotlivého člena skupiny na řádek samostatně. To znamená více řádků na skupinu.

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

Pak můžete dotazovat jednodušším způsobem a máte příležitost vytvořit indexy, aby byl dotaz velmi rychlý.

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


  1. Jak změnit barvu pozadí formuláře v Accessu 2016

  2. Více GROUP_CONCAT na různých polích pomocí MySQL

  3. Datový model předplatného SaaS

  4. Zabýváte se vnořenými sadami v mysql?