MySQL SELECT/WHERE mit Explode PHP Character für kommagetrennte Felder

11. Juni 2010  |  Kommentar schreiben   |  Tags: , , ,



Bei Facebook teilen

Es kommt oft vor, dass wir nicht normalisierte Tabellen in MySQL mit Feldern, die Kommagetrennte Werte enthalten, ähnlich wie per JOIN abfragen möchten. Das ist leider ohne weiteres nicht möglich, da aufgrund der 1-ten Normalisierung jeder Wert in einer eigenen Zeile geschrieben werden soll, damit der JOIN funktionieren kann. Stellen Sie sich vor Sie haben eine alte und große Tabelle, die Felder in folgender Form enthält:

Spaltenname: SelectedIDs
Werte: 1,5,23,333,2315

Das erste, was man machen würde um die Werte abzufragen, wäre eine Abfrage mit WHERE … IN (wert1, wert4):

SELECT Name FROM Tabelle WHERE MeineID IN (SelectedIDs)

Das funktioniert leider nicht, da die Kommagetrennte Werte in dieser Form nicht an IN(…) übergeben werden können, im Gegensatz zu einem Array aus ein SELECT oder eine wirklich reingeschriebene Zeichenkette – 1,24,54 usw. Die PHP Funktion EXPLODE(TRENNZEICHEN, ZEICHENKETTE) generiert ein Array, der so ähnlich von MySQL generiert werden könnte, um an die WHERE … IN (AUS_EXPLODE_ARRAY) übergeben werden kann. MySQL unterstützt leider kein EXPLODE, reguläre Ausdrücke aber schon. Das wird nämlich unsere Programmierlösung für die Kommagetrennten Werte, die wir abfragen möchten.

Lösung

Es ist auch nicht immer möglich die Tabelle zu normalisieren, deswegen gibts es eine Erleichterung der Programmierung an der Stelle. Betrachten wir folgende zwei Tabellen:

Tabelle1
—————-
Name - Michael
MeineID – 2

Tabelle2
—————–
KlausurName – Englisch
SchulerIDs - 1,2,5,6

Wir haben hier den Michael, der die Klausur Englisch, zusammen mit vier anderen Schülern geschrieben hat. Wie bekommen wir ein JOIN auf die Zwei Tabellen? Folgende Abfrage kümmert sich mit einem regulären Ausdruck darum:

SELECT Name, MeineID, (SELECT KlausurName FROM Tabelle2 WHERE Tabelle1.MeineID REGEXP REPLACE(SchulerIDs, ‘,’, ‘|’)) as GeschriebeKlausur FROM Tabelle1

An der Stelle kommt der reguläre Ausdruck ins Spiel – WHERE MeinWert REGEXP (Wert1|Wert3|Wert4) gibt Wahr zurück, wenn einer der mit der Pipeline getrennten Werte mit MeinWert übereinstimmt. Mit der Funktion REPLACE wird die kommagetrennte Zeichenkette für den regulären Ausdruck aufbereitet – die Kommas werden durch ein Pipeline ersetzt. Das bedeutet, dass Ihre Werte beliebig getrennt werden können, Sie müssten einfach den zweiten Parameter der REPLACE Funktion berücksichtigen.

Somit macht MySQL einfach Spass!

Teilen

Hinterlasse eine Antwort

Du musst angemeldet sein, um einen Kommentar abzugeben.