Klaus: MySQL: Inhalt einer Zeile an bestimmten Zeichen trennen

Hallo,
und zwar habe ich folgendes Problem:

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

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?

Ich weiß, dass dieses Tabellenschema gegen die 1. Normalform verstößt, da aber am Programmcode keine Veränderungen vorgenommen werden kann, bin ich nunmal auf solch eine Lösung angewiesen.

Hoffe auf Hilfe.

  1. 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

    1. Om nah hoo pez nyeetz, Vinzenz Mai!

      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
      > [UNION](http://dev.mysql.com/doc/refman/5.0/en/union.html)                          -- 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

      wenn es einen Antworten-Award gäbe, wärst du ganz vorn. Und das meine ich ganz ernst und vor allem positiv.

      Matthias

      --
      http://www.billiger-im-urlaub.de/kreis_sw.gif