Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL selektiert getrennte Daten

Wie Strawberrys Kommentar oben andeutet, gibt es eine Möglichkeit, dies zu tun, aber es ist so hässlich. Es ist, als ob Sie Ihren teuren Küchenumbau mit Klebeband abschließen würden. Sie sollten Ressentiments gegenüber der Person empfinden, die die Datenbank auf diese Weise entworfen hat.

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;

Ausgabe, getestet auf MySQL 5.6:

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

Die Komplexität dieser Abfrage und die Tatsache, dass sie zu einem Tabellenscan gezwungen wird und nicht optimiert werden kann, sollte Sie von Was ist falsch daran, eine Liste von IDs in einer Zeichenfolge mit Trennzeichen zu speichern .

Die bessere Lösung besteht darin, eine dritte Tabelle anzulegen, in der Sie jedes einzelne Mitglied der Gruppe in einer eigenen Zeile speichern. Das heißt, mehrere Zeilen pro Gruppe.

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

Dann können Sie einfacher abfragen und haben die Möglichkeit, Indizes zu erstellen, um die Abfrage sehr schnell zu machen.

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