mysql befehl gesucht
Roger
- datenbank
moin!
ich habe ein feld in einer mysql-tabelle, dass mehrere zahlen kommagetrennt enthält (bsp: 2,5,7,89,566,888).
gibt es ein befehl, mit dem ich per select alle zeilen auswähle, in denen eine von den zahlen vorkommt?
ála "select * from tabelle where 'spalte_xy enthält 89'" lol
oder muss ich da lieber php mit hinzuziehen?
gru.
roger.
sch'nabn
ich habe ein feld in einer mysql-tabelle, dass mehrere zahlen kommagetrennt enthält (bsp: 2,5,7,89,566,888).
Das ist schlechtes Daten-Design! mach dir eine separate Tabelle wo du die für jeden Wert (deine Kommagetrennten Werte) einen Datensatz hast und dich mit einem attribut auf einen/den Datensatz deiner jetztigen Tabelle beziehst.
mfg Tobias
Hi!
ála "select * from tabelle where 'spalte_xy enthält 89'" lol
SELECT * FROM tabelle WHERE spalte_xy LIKE "%xxx%" müßte klappen. Dabei hättest du aber erstmal das Problem, daß wenn du z.B. nach 7 suchst auch Zeilen mit Zahlen wie 57 oder 273 ausgewählt würden. In einem nächsten Schritt könntest du natürlich noch das Trennzeichen mit einbeziehen ("... LIKE "%7,%"), aber das würde dann die letzte Zahl von der Suche ausschließen (wenn du nicht das Trennzeichen noch immer hinten anhängst).
Soweit zu den Möglichkeiten (die mir bekannt sind) es mit dem Stand der Dinge umzusetzen. Ansonsten hat Tobias aber recht, daß das DB-Design sich nicht allzu glücklich liest. Würdest du alle Werte als einzelne Datensätze speichern, könntest du über einen Index ggf. sogar die Dauer der Suchabfrage verringern.
Gruß,
Matthias
Halihallo makaio
ála "select * from tabelle where 'spalte_xy enthält 89'" lol
SELECT * FROM tabelle WHERE spalte_xy LIKE "%xxx%" müßte klappen. Dabei hättest du aber erstmal das Problem, daß wenn du z.B. nach 7 suchst auch Zeilen mit Zahlen wie 57 oder 273 ausgewählt würden. In einem nächsten Schritt könntest du natürlich noch das Trennzeichen mit einbeziehen ("... LIKE "%7,%"), aber das würde dann die letzte Zahl von der Suche ausschließen (wenn du nicht das Trennzeichen noch immer hinten anhängst).
Das funktioniert noch immer nicht zu 100%, z.B. würde bei
LIKE "%7,%" auch die 57 gefunden (die 273 jedoch nicht). Falls man
davon ausgeht, dass nur nummerische Werte in der Liste vorkommen,
ist der Delimiter ein bestimmtes nicht nummerisches Zeichen (z.B.
das Komma), welches jeweils vor _und_ nach dem nummerischen Eintrag
kommt:
Das Feld muss also alla ",xx,yy,zz," aufgebaut sein und die Abfrage
muss auf LIKE "%,xx,%" lauten. Nur so kann man gewährleisten, dass
auch wirklich der und nur der abgefragte Wert in der Liste steht.
Soweit zu den Möglichkeiten (die mir bekannt sind) es mit dem Stand der Dinge umzusetzen. Ansonsten hat Tobias aber recht, daß das DB-Design sich nicht allzu glücklich liest.
Da schliesse ich mich natürlich an. Obwohl es in einigen Fällen auch
wesentlich besser sein kann... Aber diese "einigen Fälle" sind
sicherlich nicht so zahlreich, wie der "avarage case".
Würdest du alle Werte als einzelne Datensätze speichern, könntest du über einen Index ggf. sogar die Dauer der Suchabfrage verringern.
Leider nein. Ein Index indiziert die Attributwerte vom Stringanfang
her, man hat keine Chance Abfragen mit LIKE "%x%" zu optimieren.
LIKE "x%"
kann über Index optimiert werden.
LIKE "%x"
kann _nicht_ optimiert werden.
LIKE "%x%"
kann auch nicht optimiert werden und ist deswegen schlicht böse[tm].
Indizies sind einfach nicht darauf ausgelegt (obwohl es theoretisch
Möglich wäre, aber praktisch fast nie umgesetzt ist) Teilbereiche
des Attributes "separat" zu indizieren.
Viele Grüsse
Philipp