casi242: Teilstring in einem mySQL-Feld abfragen..evtl. find_in_set ?

Hallo !

Bin immer noch mit meinem Tabellen filtern beschäftigt un auch sonst als Anfänger in Sachen SQL/PHP/HTML/etc. zu bezeichnen.

Ich gehe mal davon aus, dass eine Datensatz in einer Tabelle "set" genannt wird und das Feld eben eine Variable in diesem Datensatzes ist.

Das Filtern klappt insofern, dass ich eine Wert per Dropdownliste als Kriterium auswähle und die Datensätze danach gefiltert werden. Leider erst nach dem klicken eines Buttons.

Jetzt habe ich aber eine Sortierkriterium zur Auswahl, was nicht als Wert alleine in einem Feld steht, sondern mit anderen Werten zusammen.

Wie kann ich in einem Datensatz ein Feld abfragen, ob sich dieser Wert bzw. String neben anderen darin befindet ?!

  
select * from MEINETABELLE where find_in_set("MEINKRITERIUM","$FELD")  

"$FELD" ist die Variable, indem u. a. der Wert steht, auf die das Feld geprüft werden soll.

Ich hatte gehofft, dass er den Begriff "MEINKRITERIUM" in dem Feld bzw. in der Variable "$FELD" findet und den Datensatz entsprechend in die $query aufnimmt.

Doch eine SQL-Abfrage in phpmyadmin brachte null werte zurück.

Was läuft das falsch oder wie könnte ich das Feld noch abfragen ?

Gruß und Dank

Casi

  1. Hi,

    Ich gehe mal davon aus, dass eine Datensatz in einer Tabelle "set" genannt wird und das Feld eben eine Variable in diesem Datensatzes ist.

    Den Datensatz nennt man ueblicherweise Datensatz, oder Zeile; und die Felder auch Spalten.

    Jetzt habe ich aber eine Sortierkriterium zur Auswahl, was nicht als Wert alleine in einem Feld steht, sondern mit anderen Werten zusammen.

    Das klingt danach, als ob das Datendesign nicht besonders guenstig waere - du solltest dich mit dem Stichwort Normalisierung beschaeftigen.

    select * from MEINETABELLE where find_in_set("MEINKRITERIUM","$FELD")

    
    >   
    > "$FELD" ist die Variable, indem u. a. der Wert steht, auf die das Feld geprüft werden soll.  
      
    Und wie sieht das Statement aus, wenn die Variable aufgeloest wurde?  
      
    Was ist "MEINKRITERIUM", warum steht es in Anfuehrungszeichen?  
      
    Hast du dir im Handbuch angeschaut, in welcher Reihenfolge FIND\_IN\_SET seine Parameter erwartet?  
      
    MfG ChrisB  
      
    
    -- 
    „This is the author's opinion, not necessarily that of Starbucks.“
    
    1. Hello again !

      Jetzt habe ich aber eine Sortierkriterium zur Auswahl, was nicht als Wert alleine in einem Feld steht, sondern mit anderen Werten zusammen.

      Das klingt danach, als ob das Datendesign nicht besonders guenstig waere - du solltest dich mit dem Stichwort Normalisierung beschaeftigen.

      Das stimmt. Habe auch darüber gelesen. Es muss aber im Moment so bleiben, weils mehr Sinn macht.

      select * from MEINETABELLE where find_in_set("MEINKRITERIUM","$FELD")

      
      > >   
      > > "$FELD" ist die Variable, indem u. a. der Wert steht, auf die das Feld geprüft werden soll.  
      >   
      > Und wie sieht das Statement aus, wenn die Variable aufgeloest wurde?  
      >   
        
      Sja, da bleibe ich mit dem Verständnis hängen.  
        
      
      > Was ist "MEINKRITERIUM", warum steht es in Anfuehrungszeichen?  
      >   
        
      Ich habe eine Tabelle z. B.:  
        
      AUTOMARKE ! ELEKTRONIK  ! ZUSTAND  
      \------------------------\_--------  
      OPEL      ! ABS         ! GUT  
      MERCEDES  ! ESP         ! MITTEL  
      FORD      ! ABS         ! GUT  
      BMW       ! ABS und ESP ! GUT  
        
      "MEINKRITERIUM" wäre also z. B. der reine Text ESP.  
        
      Ich möchte, dass bei Auswahl des Filterkriteriums "ESP" alle Autos mit ESP angezeigt werden. Auch die, die ABS haben.  
        
      Habs auch schon ohne Klammern versucht, als $meinkriterium versucht und als '$meinkriterium' und als "ESP" und als 'ESP'  
        
      
      > Hast du dir im Handbuch angeschaut, in welcher Reihenfolge FIND\_IN\_SET seine Parameter erwartet?  
        
      FIND\_IN\_SET(str,strlist)  
        
      So wie ich das verstanden habe, ist str der gesuchte String und in strlist stehen die gesuchten Werte bzw. der Wert...hmh, da ist doch was faul. Evtl doch der falsche Befehl ?  
        
      Ich muss einen Teilstring aus einem ganzen String heraussuchen...  
        
      Sja, weiss auch nicht so recht weiter...  
        
      Gruß und Dank  
        
      casi
      
      1. Hi,

        Das klingt danach, als ob das Datendesign nicht besonders guenstig waere - du solltest dich mit dem Stichwort Normalisierung beschaeftigen.

        Das stimmt. Habe auch darüber gelesen. Es muss aber im Moment so bleiben, weils mehr Sinn macht.

        Wie lautet deine Begruendung dafuer?

        (Hinweis" "Ist mir zu kompliziert" oder "kann ich nicht mit umgehen" sollten keine Begruendung fuer sowas sein.)

        FIND_IN_SET(str,strlist)

        So wie ich das verstanden habe, ist str der gesuchte String und in strlist stehen die gesuchten Werte bzw. der Wert...hmh, da ist doch was faul. Evtl doch der falsche Befehl ?

        In welchem Format erwartet den FIND_IN_SET die Werte im String - wie von einander abgetrennt?
        Entspricht das der Form, in der du die Daten vorliegen hast?

        MfG ChrisB

        --
        „This is the author's opinion, not necessarily that of Starbucks.“
        1. Hi,

          Das klingt danach, als ob das Datendesign nicht besonders guenstig waere - du solltest dich mit dem Stichwort Normalisierung beschaeftigen.

          Das stimmt. Habe auch darüber gelesen. Es muss aber im Moment so bleiben, weils mehr Sinn macht.

          Wie lautet deine Begruendung dafuer?

          (Hinweis" "Ist mir zu kompliziert" oder "kann ich nicht mit umgehen" sollten keine Begruendung fuer sowas sein.)

          Umgehen lässt sich das mit neuen Feldern elektronik1, elektronik2, elektronik3, etc. Ist natürlich mit viel Aufwand verbunden, da es über zig Seiten, Abfragen Ausgaben, Bearbeitungen auch geändert werden müsste.

          Und wenn man es dann doch macht werden die Tabellen durch neue Spaltenüberschriften breiter und weniger Informationen können dargestellt werden, da die Breite begrenzt ist. Die Übersichtlichkeit geht flöten.
          Alternativ man muss die Inhalte von drei Feldern in einer Spalte darstellen.

          Und wenn das so weiter geht, werde ich das wohl machen müssen. Komme so nicht weiter, glotze schon wieder seit 11 Stunden auf den Rechner, mit 1000 geöffneten Anleitungs- und Hilfeseiten...und keine Lösung und die Konzentration schwindet auch

          FIND_IN_SET(str,strlist)

          So wie ich das verstanden habe, ist str der gesuchte String und in strlist stehen die gesuchten Werte bzw. der Wert...hmh, da ist doch was faul. Evtl doch der falsche Befehl ?

          In welchem Format erwartet den FIND_IN_SET die Werte im String - wie von einander abgetrennt?
          Entspricht das der Form, in der du die Daten vorliegen hast?

          Nein, nicht direkt. Bei mir steht z. B. ABS, ESP, 3D ESP, 3X ADS

          ...also so auch mit Leerzeichen

          MfG

          1. Hi,

            Umgehen lässt sich das mit neuen Feldern elektronik1, elektronik2, elektronik3, etc. Ist natürlich mit viel Aufwand verbunden,

            Es waere vor allem grandioser Unsinn.
            Das ist keine Normalisierung, sondern Nonsense.

            Und wenn man es dann doch macht werden die Tabellen durch neue Spaltenüberschriften breiter und weniger Informationen können dargestellt werden, da die Breite begrenzt ist. Die Übersichtlichkeit geht flöten.

            Tabellen haben keine "Breite".
            Sie sind etwas abstraktes, in der Datenbank befindliches.

            Alternativ man muss die Inhalte von drei Feldern in einer Spalte darstellen.

            Nein, muss man nicht.

            Aber was Normalisierung bedeutet, darueber sollte "man", also du, sich jetzt noch mal informieren.

            MfG ChrisB

            --
            „This is the author's opinion, not necessarily that of Starbucks.“
            1. Hi,

              Umgehen lässt sich das mit neuen Feldern elektronik1, elektronik2, elektronik3, etc. Ist natürlich mit viel Aufwand verbunden,

              Es waere vor allem grandioser Unsinn.
              Das ist keine Normalisierung, sondern Nonsense.

              Hmmh, was denn sonst ? Müssen doch Felder hinzugefügt werden, d. h. die Daten noch feiner aufgeplittet werden.
              Ok, werds mir mit dem Normalisieren mal durchlesen !

              Und wenn man es dann doch macht werden die Tabellen durch neue Spaltenüberschriften breiter und weniger Informationen können dargestellt werden, da die Breite begrenzt ist. Die Übersichtlichkeit geht flöten.

              Tabellen haben keine "Breite".
              Sie sind etwas abstraktes, in der Datenbank befindliches.

              Ok, die Ausgabe meiner Daten in einer Liste mit Zeilen, Spalten und Überschriften, so, dass es mir möglich ist die Informationen übersichtlich darzustellen für Nomalsterbliche wohl fälschlicherweise auch "Tabelle" genannt. Sollte es nicht nur Meta-Physik geben, sondern auch Meta-Programmierung ;-) ?!

              Alternativ man muss die Inhalte von drei Feldern in einer Spalte darstellen.

              Nein, muss man nicht.

              Aber was Normalisierung bedeutet, darueber sollte "man", also du, sich jetzt noch mal informieren.

              Yup !

              Der Fehler waren tatsächlich die Leerzeichen. Der will die Daten leider im Fomat; wert1,wert2,wert3,wert4 haben. Sja, wenn ich die Werte dann in "tabellenform" ausgebe muss ich dann wohl künstlich ein Leerzeichen schaffen, sieht sonst blöd aus.

              MfG

              1. Mahlzeit casi242,

                Hmmh, was denn sonst ? Müssen doch Felder hinzugefügt werden, d. h. die Daten noch feiner aufgeplittet werden.

                Jein. Es müssen Tabellen hinzugefügt werden - keinesfalls jedoch für jede mögliche zusätzliche Eigenschaft eine neue Spalte!

                Ok, werds mir mit dem Normalisieren mal durchlesen !

                Das solltest Du wirklich dringend - fange damit am Besten sofort an.

                Dein Beispiel einigermaßen vernünftig abgebildet würde dann z.B. so aussehen:

                Tabelle "Auto":
                ID | AUTOMARKE | ZUSTAND
                ---+-----------+--------
                 8 | OPEL      | GUT
                15 | MERCEDES  | MITTEL
                23 | FORD      | GUT
                42 | BMW       | GUT

                Tabelle "Elektronik":
                ID | NAME
                ---+-----
                11 | ABS
                47 | ESP

                Tabelle "Auto2Elektronik":
                ID | AutoID | ElektronikID
                ---+--------+-------------
                 1 | 8      | 11
                 2 | 15     | 47
                 3 | 23     | 11
                 4 | 42     | 11
                 5 | 42     | 47

                So kannst Du mittels geeigneter Masken zur Verwaltung jederzeit neue Elektronik-Eigenschaften erfassen, Autos zuordnen usw.

                ABSOLUT UNERLÄSSLICH ist dabei natürlich, dass jede Tabelle einen eindeutigen Primärschlüssel hat (IMHO am Besten geeignet ist dafür eine rein numerische Spalte).

                Tabellen haben keine "Breite".
                Sie sind etwas abstraktes, in der Datenbank befindliches.

                Ok, die Ausgabe meiner Daten in einer Liste mit Zeilen, Spalten und Überschriften, so, dass es mir möglich ist die Informationen übersichtlich darzustellen für Nomalsterbliche wohl fälschlicherweise auch "Tabelle" genannt.

                Nicht fälschlich. Es sind beides "Tabellen". Nur müssen in einer Datenbank existierende Tabellen, die normalisiert sind, nicht zwangsläufig genau so auch an einer Oberfäche abgebildet werden - z.B. aus Gründen der Lesbarkeit usw.

                Für die "Anwendersicht" würde man natürlich bei der entsprechenden Abfrage mittels geeigneter JOINs alle zu einem Auto existierende Elektronik-Merkmale mit aus der Datenbank herausfischen und sinnvoll aufbereitet dem Anwender präsentieren ... z.B. als einfache komma-separierte Liste innerhalb einer Tabellenspalte.

                Für die Datenhaltung sind aber in jedem Fall Tabellen in normalisierter Form die geeignete Wahl!

                MfG,
                EKKi

                --
                sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|