Ankündigung

Einklappen
Keine Ankündigung bisher.

wert aus liste abfragen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • wert aus liste abfragen

    hallo,

    ich habe ein db-feld, in dem kommaseparierte integer stehen (z.b.:1,6,23,9)
    nun möchte ich eine abfrage machen, in der z.b. alle records enthalten sind, die in diesem feld den wert 6 enthalten.

    where feldname=6 geht ja nicht, weil auch andere werte daneben stehen können.

    ich komme auf keine lösung, obwohl es sicher recht simpel ist.

    danke

  • #2
    so könntest du es machen:

    Code:
    ... where feldname like '%,6,%' 
             or  feldname like '6,%'
             or  feldname like '%,6'
    Wahrscheinlich habe ich jetzt einen Fall vergessen, aber ein bisschen mitdenken kannst du ja auch

    Eigentlich sträuben sich mir ja die Nackenhaare bei der Antwort, denn die Frage lässt auf schlechtes DB-Design schließen...solltest du vielleicht nochmal überdenken.

    Kommentar


    • #3
      danke, ist leider nicht 'meine' db, sondern von einem cms

      Kommentar


      • #4
        http://de.wikipedia.org/wiki/Normali...28Datenbank%29
        durchlesen und umsetzen

        Alles andere wird dir früher oder später einen Haufen Mehr-Arbeit abverlangen.
        Du machst einen großen Vorteil einer Datenbank kaputt, wenn du deine Daten nicht alle atomar aufteilst. "1,6,23" ist keine atomare Aufteilung.
        Du kannst mit den Informationen dieser nicht-atomaren Liste garnichts mehr anstellen. All die schönen Features der Datenbank wie sortieren, suchen, Berechnungen durchführen, etc. gehen durch dieses Datenbank-Design verloren.
        Bearbeiten geht auch nur mit String-Operationen...

        Alles Rechen- und Programmier-Zeit die dir durch schlechtes DB-Design verloren gegangen ist.


        Die Abfrage von louis kannst du dir übrigens auch schenken. Gefunden werden nämlich auch alle Datensätze mit einer 6 am Anfang oder Ende (16, 60, ..).

        Bleibt dir nur die Möglichkeit auch den ersten und letzten Eintrag mit einem Komma zu umrahmen ",1,6,23," aber wie gesagt, änder lieber dein Datenbank Design. Wenn du Hilfe brauchst poste einfach ins MySQL-Forum (vorher mal den Wiki-Link oben durchlesen).

        Kommentar


        • #5
          Zitat von Zergling
          Die Abfrage von louis kannst du dir übrigens auch schenken. Gefunden werden nämlich auch alle Datensätze mit einer 6 am Anfang oder Ende (16, 60, ..).
          Ist das so? Ich hatte in Erinnerung, dass man Wildcards explizit mit einem % angeben muss...also sollte doch

          Code:
          like '6,%'
          nur matchen, wenn die 6 ganz am Anfang steht...

          Oder habe ich das was falsch in Erinnerung?

          Kommentar


          • #6
            @zergling wie gesagt, die db habe ich nicht designt. es ist eine tabelle aus typo3.

            Kommentar


            • #7
              louis du hast Recht. Hatte deinen Code mit LIKE gesehen und mich an eine Abfrage erinnert, die ich mal gemacht hatte (weil ich früher mal genau das gleiche mit so einer Liste verbrochen hatte) und da tauchte genau das Problem auf, dass ich bei dir zu unrecht bemängelt hatte

              Kommentar


              • #8
                Um diese meiner Meinung nach doch recht umständliche LIKE-Konstrukt zu vermeiden, kann es sich durchaus anbieten, die Funktion FIND_IN_SET() anzusehen.

                Kommentar


                • #9
                  Leider hat Typo3 viele solcher Konstrukte in der DB. Das ist mit ein Grund, warum ich eher wieder davon abgekommen bin (der Hauptgrund ist aber, dass es für die meisten Anwendungen viel zu umfangreich ist). Aber für diesen Fall kennt MySQL ja auch noch reguläre Ausdrücke: http://dev.mysql.com/doc/refman/4.0/...functions.html. Die Abfrage würde dann etwa so lauten (ohne Garantie):
                  Code:
                  ... where feldname regexp '[^,]6[,$]'

                  Kommentar

                  Lädt...
                  X