Durch Kommas getrennte Wörter in einer Mysql Spalte auswählen?
Ich möchte, dass wenn man aus der Spalte "help" Einkaufshilfe abfragt alle mit Einkaufshilfe angezeigt werden. Da die zweite Spalte aber noch mit einem anderen Wort durch ein Komma getrennt ist, erkennt sql das nicht. Was kann ich machen, dass es trotzdem erkannt wird?
3 Antworten
Wie bereits geschrieben mit dem LIKE Operator, sprich die Bedingung wäre:
help LIKE '%Einkaufshilfe%'
Generell nutzt man sowas, vor allem am Anfang eher nicht, da dann die Datenbank Indizes nicht genutzt werden können.
Eine weitere Möglichkeit ist natürlich die Werte zu splitten mittels rekursiven Queries. Die mit Abstand beste Möglichkeit wäre aber ein vernünftiges konsistentes Datenbankmodel. In einzelne Zellen gehören nicht mehrere Werte, diese hier mittels Komma separierten Werte gehören in eigene Zeilen, sonst führt man den Sinn einer relationalen Datenbank ad absurdum.
Es gibt zwei Möglichkeiten:
Vorab: Deine Tabelle verstößt gegen die 1. Normalform, die lautet: "Jeder Spalteninhalt muss atomar vorliegen". Das heißt, dass keine Datensammlungen in einer Spalte stehen dürfen. Ich würde eine extra Tabelle anlegen, die du dann mit einem Fremdschlüssel verbindest. Beispiel:
Person(ID, Name... etc)
benoetigen(PersonenID, HilfsbezeichungsID) // Beides Femdschlüssel
Hilfen(ID, Bezeichnung)
Dann nurnoch mit einem JOIN alle Daten abfragen.
Das wär die beste Variante (meiner Meinung nach). Mehr zu der Normalform
Wenn du aber nichts mehr an deinem DB-Schema ändern willst gibt es noch eine andere (unschöne) Variante:
Der LIKE Operator:
Dann gibst du an: SELECT * FROM ... WHERE help LIKE '%Einkaufshilfe%'
Das Prozentzeichen signalisiert SQL, dass davor und danach noch weitere Buchstaben stehen können.
Es gibt auch noch andere sogenannte Escape Character, mehr dazu hier.
https://www.mysqltutorial.org/mysql-like/
Und dann Wildcards benutzen, LIKE 'Einkaufshilfe%' oder so
Ja, % steht für 0, 1 oder mehrere beliebige Zeichen. Wenn Du also %Einkaufshilfe% reingibst sucht er im gesamten String nach Einkaufshilfe egal was davor und dahinter steht. Für genau solche Answendungsfälle ist die Funktion ja gedacht ^^
Vielen Danke!
Könnte der Code dann so aussehen?
"SELECT * FROM hilfe WHERE help LIKE '".$help."' AND bezirk LIKE '".$bezirk."' ORDER BY RAND() LIMIT 1";
Logisch richtig, würde mich aber auch gleich mal mit PDO Statements befassen und keine unescapten Werte reingeben, vor allem nicht wenn es Usereingaben sind. Siehe SQL Injections.
Funktioniert es auch wenn es durch ein Komma getrennt ist?