MySQL: Inhalt einer Zeile an bestimmten Zeichen trennen
Klaus
- datenbank
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.
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
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