2016-12-08 6 views
0

ich mit, dass eine Tabelle sieht wie folgt aus:MySQL GROUP BY FIND_IN_SET

|id | name | sport   | 
|---|------|------------------| 
|1 | john | kitesurf   | 
|2 | mike | kitesurf   | 
|3 | tobi | tennis, kitesurf | 
|4 | mat | surf, skate  | 
|5 | bob | tennis   | 

Wie kann ich eine Liste mit Gruppen von Sport erhalten, die wie folgt aussehen:

| sport  | name 
|-----------|------- 
| kitesurf | john 
| kitesurf | mike 
| kitesurf | tobi 
| tennis | tobi 
| tennis | bob 
| skate  | mat 
| surf  | mat 

Ist es irgendwie machbar mit nur MySQL? Danke für jeden Tipp :)

+0

MySQL nicht auch jede integrierte Funktion eine Zeichenfolge zu teilen. Sie sollten keine durch Kommas getrennten Listen verwenden und eine Viele-zu-Viele-Beziehungstabelle verwenden. – Barmar

Antwort

2

Sie brauchen eine andere Tabelle, die jede einzelne Sportart auflistet.

CREATE TABLE Sports (sport VARCHAR(10) PRIMARY KEY); 
INSERT INTO Sports (sport) VALUES ('kitesurf'), ('tennis'), ('skate'), ('surf'); 

Dann können Sie auf diese Weise verbinden:

SELECT s.sport, n.name 
FROM NoOneNamesTheirTableInSqlQuestions AS n 
INNER JOIN Sports AS s ON FIND_IN_SET(s.sport, n.sport); 

Aber das ist eine ineffiziente Abfrage, da die FIND_IN_SET() keinen Index verwenden können.

Siehe meine Antwort auf Is storing a delimited list in a database column really that bad?

+0

Vielen Dank Ihnen @Bill. Ich habe meinen Fehler verstanden und werde komma-separierte Werte in Zukunft vermeiden. Aber eine Teilfrage: Warum gibt es einen "set" -Typ für MySQL-Spalten, wenn CSV so schlecht ist? –

+0

Ich vermute, dass einige Kunden von MySQL sie bezahlt haben, um sie zu implementieren. Es war vielleicht die schlechteste Lösung für ihr spezifisches Projekt. Beachten Sie, dass Sie einen Index nicht verwenden können, um nach einem bestimmten Wert in einem 'SET'-Datentyp zu suchen. Wenn Sie nicht nach einem Wert in der Menge suchen müssen, kann dies eine kompakte Methode zum Speichern einer Sammlung von Optionen sein. –