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

MySQL wybierz dane rozdzielane

Jak sugeruje komentarz Strawberry powyżej, jest na to sposób, ale jest to takie brzydkie. To jak wykończenie drogiej przebudowy kuchni za pomocą taśmy klejącej. Powinieneś czuć urazę do osoby, która w ten sposób zaprojektowała bazę danych.

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;

Wyjście, przetestowane na MySQL 5.6:

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

Złożoność tego zapytania oraz fakt, że będzie ono zmuszone do skanowania tabeli i nie może zostać zoptymalizowane, powinny przekonać Cię do co jest nie tak z przechowywaniem listy identyfikatorów w rozdzielanym ciągu .

Lepszym rozwiązaniem jest utworzenie trzeciej tabeli, w której każdy członek grupy będzie przechowywany osobno w rzędzie. Oznacza to wiele wierszy na grupę.

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

Następnie możesz wykonywać zapytania w prostszy sposób i masz możliwość tworzenia indeksów, które przyspieszają wykonywanie zapytań.

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. Dlaczego kod w wywołaniu sukcesu AJAX nie działa?

  2. Importowanie dużych tabel MySQL

  3. MySQL nie uruchamia się

  4. while pętla i dołącz do wyjścia w mysql php

  5. Czy mogę porównać znacznik czasu MysQL z kolumnami daty i godziny? to jest złe?