Roger: mysql befehl gesucht

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.

--
Dein eigenes Newslettersystem auf deiner Homepage: http://newsletter.maennchen1.de
  1. 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

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

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