Vinzenz Mai: MySQL: Inhalt einer Zeile an bestimmten Zeichen trennen

Beitrag lesen

Hallo,

Für eine vorgegebene Aufgabenverwaltungssoftware (trac) trage ich in das Feld 'zuständige Personen' mehrere Personen per Komma getrennt ein. Den Programmcode von Trac kann ich leider nicht verändern.

Die Tabelle in der DB sieht dann ca. so aus:
id | text | owner
1 | Spülmaschine ausräumen | Alice, Bob
2 | Rasen mähen | Bob
3 | Haus putzen | Alice, Bob, Carla

Nun kann ich bei der Software eigene SQL Befehle angeben, die sodann in Berichte erzeugt werden. Nun möchte ich einen Bericht erstellen, der die einzelnen Aufgaben je Person anzeigt, also in etwa so:

Alice:
1 | Spülmaschine ausräumem
3 | Haus putzen

Bob:
1 | Spülmaschine ausräumen
2 | Rasen mähen
3 | Haus putzen

Carla:
3 | Haus putzen

Da ich wie gesagt nur einen enzigen SQL Befehl definieren kann, würde ich das oben gewünschte Ergebnis erhalten falls dieser SQL Befehl folgendes Ergebnis zurückliefern würde:
id | text | person
1 | Spülmaschine ausräumen | Alice
1 | Spülmaschine ausräumen | Bob
2 | Rasen mähen | Bob
3 | Haus putzen | Alice
3 | Haus putzen | Bob
3 | Haus putzen | Carla

Ja, das geht. Nicht besonders performant, aber das geht. Vorausgesetzt, Du kennst die Benutzer:

  
SELECT                         -- Gib mir  
    id,                        -- id  
    text,                      -- text und  
    'Alice' person             -- die Zeichenkette 'Alice' in einer Spalte,  
                               -- die "person" heißt  
FROM                           -- aus  
    tabelle                    -- meiner Tabelle  
WHERE                          -- wobei mich nur die Datensätze interessieren  
    owner LIKE '%Alice%'       -- bei denen irgendwo in der Spalte owner der  
                               -- Wert 'Alice' vorkommt  
[link:http://dev.mysql.com/doc/refman/5.0/en/union.html@title=UNION]                          -- und füge zur Ergebnismenge folgende  
                               -- Datensätze hinzu:  
SELECT  
    id,  
    text,  
    'Bob'                      -- hier interessiert uns "Bob"  
                               -- einen zweiten Namen können wir nicht  
                               -- vergeben ...  
FROM  
    tabelle  
WHERE  
    owner LIKE '%Bob%'  
UNION                          -- und so weiter und so fort ...  
-- ...  

Da ich nicht davon ausgehe, dass es sinnvoll ist, dass ein Benutzer bei der gleichen Aufgabe mehr als einmal eingetragen ist und in der Ergebnismenge nur einmal je Aufgabe aufgeführt werden sollte, sollte ein UNION DISTINCT (MySQL-Standardverhalten bei UNION) ausreichen.

Gibt es dort irgendwie eine Möglichkeit, dass ich MySQL sage, dass dieses den Inhalt der Spalte 'owner' anhand des Komma trennen soll und für jeden Substring eine neue Zeile generieren soll?

Jein. Dazu müsstest Du eine Stored Procedure verwenden. In einer solchen kannst Du mit einer Schleife durch den Inhalt einer Spalte durchlaufen und Zeichenkettenoperationen auf diese anwenden - und so die Ergebnismenge zusammenbauen und zurückgeben.

Kennst Du die eingetragenen Benutzer oder ist das reiner "Freitext"?

Freundliche Grüße

Vinzenz