habichnicht: Select

Hallo,

nehmen wir an ich hätte folgendes Datenbankfeld in einer MySQL-DB:

KundenIDs [Varchar 255]
in diesem Feld sind verschiedene IDs mit Komma getrennt.
also so zB: "12,28,14,2,432,54,122"

Ich möchte nun zB alle selektieren wo in KundenIDs die KundenID "2" vorkommt. Wie geht das?

Mit LIKE, %LIKE% , %LIKE, LIKE% geht es nicht weil die ID ja überall stehen kann und ich auch nicht (beispielsweise) die "12" selektieren möchte, sondern nur die 2!

Geht das überhaupt MIT SQL in EINEM Select?
(Also nicht mit PHP oder so die Rows durchlaufen usw^^).

Vielen Dank für eure Hilfe!

  1. Salut,

    KundenIDs [Varchar 255]
    in diesem Feld sind verschiedene IDs mit Komma getrennt.
    also so zB: "12,28,14,2,432,54,122"

    das ist ein Design-Fehler.
    1. Was passiert, wenn Du einer Entity soviele IDs zurodnen mußt, dass sie nicht als  Varchar 255 gespeichert werden können?

    2. Was bedeuten diese IDs - sind das Foreign keys? Dann solltest Du eine n:m-Beziehung aufbauen und in einer eigenen Tabelle speichern.

    Gruß Sven

  2. nehmen wir an ich hätte folgendes Datenbankfeld in einer MySQL-DB:

    Dann ist dein Datenbankdesign kaputt.

    Ich möchte nun zB alle selektieren wo in KundenIDs die KundenID "2" vorkommt. Wie geht das?

    Zuerst normalisiere die Daten. Erst wenn das nicht möglich ist, mache dir weitere Gedanken.

    Mit LIKE, %LIKE% , %LIKE, LIKE% geht es nicht weil die ID ja überall stehen kann und ich auch nicht (beispielsweise) die "12" selektieren möchte, sondern nur die 2!

    Dann beziehe doch das Trennzeichen mit ein, ggf. unter Verwendung der RegExp-Funktionen von MySQL. Entweder die 2 steht allein, mit einem Komma davor und am Ende, einem Komma danach und am Anfang oder weder noch und von zwei Kommas eingeschlossen.

    JJ

  3. Mahlzeit,

    KundenIDs [Varchar 255]
    in diesem Feld sind verschiedene IDs mit Komma getrennt.
    also so zB: "12,28,14,2,432,54,122"

    Wie von anderer Seite schon gesagt wurde: Dein Datenbankdesign ist Müll. Baue eine vernünftige n:m-Beziehung auf, dann sind die Abfragen 1. bedeutend einfacher zu realisieren und 2. bedeutend schneller.

    Ich möchte nun zB alle selektieren wo in KundenIDs die KundenID "2" vorkommt. Wie geht das?

    Grundsätzlich mit "LIKE".

    Mit LIKE, %LIKE% , %LIKE, LIKE% geht es nicht weil die ID ja überall stehen kann und ich auch nicht (beispielsweise) die "12" selektieren möchte, sondern nur die 2!

    Richtig. Du willst also nur den String "2" haben. Sinnvollerweise dort, wo er von Kommata umschlossen ist, also ",2,". Am Anfang oder Ende steht aber keins - also fügen wir bei der Prüfung einfach eins hinzu:

    SELECT KundenIDs WHERE ','||KundenIDs||',' LIKE '%,2,%'

    Geht das überhaupt MIT SQL in EINEM Select?
    (Also nicht mit PHP oder so die Rows durchlaufen usw^^).

    Ja. Mit Spucke, Tesa und Nadel und heißem Faden. Die Performance wird unterirdisch sein. Ändere also Deine Datenstruktur.

    MfG,
    EKKi

    --
    sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
  4. echo $begrüßung;

    KundenIDs [Varchar 255]
    in diesem Feld sind verschiedene IDs mit Komma getrennt.
    also so zB: "12,28,14,2,432,54,122"

    Ich möchte nun zB alle selektieren wo in KundenIDs die KundenID "2" vorkommt. Wie geht das?

    Für solche Designfehler kann man auch die Funktion FIND_IN_SET() missbrauchen. Das geht sogar ohne großartiges weiteres "Gehampel". Da diese Funktion aber keinen Index verwenden kann, und du auch kein Feld vom Typ SET vorliegen hast, für das Bit-Arithmetik verwendet werden könnte, ist es besser, wenn du deine Datenbankinhalte normalisierst.

    echo "$verabschiedung $name";