Können select-Abfragen zu lang sein?

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

  • Können select-Abfragen zu lang sein?

    Ich habe folgende Abfrage auf einer PHP-Seite:

    $result=mysql_query("select land, manufaktur, serie, kuenstler, bradexnr, tellername, erscheinjahr, listenpreis, versandpreis, beschreibung, thumbnail, anzahl from teller where (nr like '%$stichw%' OR land like '%$stichw%' OR manufaktur like '%$stichw%' OR serie like '%$stichw%' OR kuenstler like '%$stichw%' OR bradexnr like '%$stichw%' OR tellername like '%$stichw%' OR erscheinjahr like '%$stichw%' OR listenpreis like '%$stichw%' OR versandpreis like '%$stichw%' OR beschreibung like '%$stichw%' OR suchbegriffe like '%$stichw%') AND (nr like '%$stichw2%' OR land like '%$stichw2%' OR manufaktur like '%$stichw2%' OR serie like '%$stichw2%' OR kuenstler like '%$stichw2%' OR bradexnr like '%$stichw2%' OR tellername like '%$stichw2%' OR erscheinjahr like '%$stichw2%' OR listenpreis like '%$stichw2%' OR versandpreis like '%$stichw2%' OR beschreibung like '%$stichw2%' OR suchbegriffe like '%$stichw2%') order by manufaktur");
    tab_out($result);

    diese funktioniert auch, wenn ich aber noch eine weitere Bedingung (wie folgt) dazu packe, wird das Ergebnis so verfälscht, dass die dritte Bedingung als OR-Abfrage und nicht als AND-Abfrage gewertet wird. Ist der Code vielleicht zu lang?

    $result=mysql_query("select land, manufaktur, serie, kuenstler, bradexnr, tellername, erscheinjahr, listenpreis, versandpreis, beschreibung, thumbnail, anzahl from teller where manufaktur like '%manuf%' AND (nr like '%$stichw%' OR land like '%$stichw%' OR serie like '%$stichw%' OR kuenstler like '%$stichw%' OR bradexnr like '%$stichw%' OR tellername like '%$stichw%' OR erscheinjahr like '%$stichw%' OR listenpreis like '%$stichw%' OR versandpreis like '%$stichw%' OR beschreibung like '%$stichw%' OR suchbegriffe like '%$stichw%') AND (nr like '%$stichw2%' OR land like '%$stichw2%' OR serie like '%$stichw2%' OR kuenstler like '%$stichw2%' OR bradexnr like '%$stichw2%' OR tellername like '%$stichw2%' OR erscheinjahr like '%$stichw2%' OR listenpreis like '%$stichw2%' OR versandpreis like '%$stichw2%' OR beschreibung like '%$stichw2%' OR suchbegriffe like '%$stichw2%') order by manufaktur");
    tab_out($result);
    Zuletzt geändert von deti; 13.05.2003, 17:47.

  • #2


    beispieldatensatz, der beim zweiten fall falsch erkannt wird?
    isses eigentlich absicht, dass du im feld manufaktur nach datensätzen suchst, die LIKE %manuf% sind und dann in den beiden großen and-bedingungen die spalte nochmal abfragst?
    Ich denke, also bin ich. - Einige sind trotzdem...

    Kommentar


    • #3
      Tschuldigung, den Fehler habe ich nicht gesehen, ist aber schon geändert.

      Bei der ersten Abfrage war das so richtig, bei der zweiten sollte manufaktur nicht in der AND-Abfrage zusätzlich abgefragt werden. Ich habe die Abfrage nur von der ersten herunter kopiert und ergänzt. Auf meinem Testserver habe ich den Fehler aber nicht.

      Kommentar


      • #4
        Können Select-Abfragen denn nun zu lang sein?

        Hallo,
        ich habe immer noch das Problem, dass diese drei AND-Verknüpfungen bei mir nicht funktionieren.
        Hat jemand eine Lösung?

        Kommentar


        • #5
          vorschlag: du postest die beiden sql-abfragen mal so formatiert, dass manwas erkennen kann und postest nen datensatz, der nicht erfasst wird obwohl er alle kriterien erfüllt
          Ich denke, also bin ich. - Einige sind trotzdem...

          Kommentar


          • #6
            Ich hoffe Du meinst es ungefähr so:

            Also hier mein Beispiel:
            Ich habe eine Tabelle mit dem Namen: liste
            sie hat 4 Spalten: nr, land, name, beschreibung
            diese Spalten sind mit Text und Zahlen gefüllt.
            es sollen aber nur die 3 Spalten: land, name, beschreibung durchsucht werden. Das Suchergebnis soll alle Datensätze liefern, die :

            1. in der Spalte name einen Eintrag in der Form vom Wert der Variablen $stichwort1 enthalten.

            2. Soll dieses Ergebnis dann noch auf die Datensätze beschränkt werden, die einen Eintrag vom Wert der Variablen $stichwort2 und $stichwort3 beinhalten.

            Meine Abfrage sieht ungefähr folgendermaßen aus:

            function abfrage ($stichwort1,$stichwort2,$stichwort3)
            {
            if($stichwort1=='' and $stichwort2=='' and $stichwort3=='')
            {
            $result=mysql_query("select land, name, beschreibung from
            liste;")
            tab_out($result);
            }

            elseif($stichwort1=='' and $stichwort2!='' or $stichwort3!='')
            {
            $result=mysql_query("select land, name, beschreibung from liste
            where (land like '%$stichwort2%' or beschreibung
            like '%$stichwort2%') AND (land like
            '%$stichwort3%' or beschreibung like
            '%$stichwort3%');")
            tab_out($result);
            }

            elseif($stichwort1!='' and $stichwort2=='' and $stichwort3=='')
            {
            $result=mysql_query("select land, name, beschreibung from liste
            where name like '%$stichwort1%';")
            tab_out($result);
            }

            else
            {
            $result=mysql_query("select land, name, beschreibung from liste
            where name like '%$stichwort1%' AND
            ((land like '%$stichwort2%' or
            beschreibung like '%$stichwort2%') AND
            (land like '%$stichwort3%' or beschreibung
            like '%$stichwort3%'));")
            tab_out($result);
            }


            Der letzte Else-Zweig funktioniert nur richtig, wenn ich für alle drei Stichworte eine Wort eingebe oder nur für die ersten.
            Gebe ich nur für das erste und das letze Stichwort einen Wert ein, wird der erste Wert nicht richtig beachtet. Es gibt dann nur ein Ergebnis mit allen Zeilen in denen der letzte Wert vorkommt.

            Beispiel:
            Meine Tabelle ist folgendermaßen gefüllt:

            nr land name beschreibung
            1 Deutschland Hansi Mann
            2 England Inge Frau
            3 Portugal Hansi verheiratet
            4 England Horst Mann
            5 England Hansi blau

            Abfrage 1:
            $stichwort1=Hansi
            $stichwort2=Mann
            $stichwort3=Deutschland

            Ergebnis 1:
            Deutschland Hansi Mann

            Abfrage 2:
            $stichwort1=Hansi
            $stichwort2=
            $stichwort3=

            Ergebnis 2:
            Deutschland Hansi Mann
            Portugal Hansi verheiratet
            England Hansi blau

            usw. (fast alle Varianten funktionieren)

            Nur wenn ich jetzt frage:
            $stichwort1=Hansi
            $stichwort2=
            $stichwort3=England

            kommt die falsche Ausgabe:
            England Inge Frau
            England Horst Mann
            England Hansi blau

            Hier dürften aber nur alle Zeilen mit dem Wert Hansi und England angezeigt werden?????????

            Kommentar


            • #7
              bist du sicher, dass folgende bedingung
              PHP-Code:
              elseif($stichwort1=='' and $stichwort2!='' or $stichwort3!=''
              auch das ist, was du gemeint hast?

              and bindet stärker als or, d.h. im klartext ist diese bedingung erfüllt, wenn
              stichwort1 leer und stichwort2 nicht leer (<- beides gleichzeitig!)
              oder
              stichwort3 nicht leer
              ist.

              eventuell solltest du in deinen logischen ausdrücken noch klammern setzen, wenn hier das or zuerst abgefragt werden soll ...
              I don't believe in rebirth. Actually, I never did in my whole lives.

              Kommentar


              • #8
                Ja, eigentlich meinte ich das so. Ich habe einfach versucht alle Möglichkeiten, die vorkommen könnten zu beachten.

                Wenn nämlich Stichwort1 leer ist, sollen alle Datensätze von der Spalte name mit einbezogen werden, in denen dann Stichwort2 und Stichwort3 stehen. Eins der beiden ist dann eventuell leer, weil ich ja eine or-Verknüpfung gewählt habe. Aber ich habe in jeder Spalte meiner Tabelle auch normalerweise Leerschritte und bekomme deshalb scheinbar auch immer für diese Abfrage das richtige Ergebnis.

                Kommentar


                • #9
                  Original geschrieben von deti
                  Wenn nämlich Stichwort1 leer ist, sollen alle Datensätze von der Spalte name mit einbezogen werden, in denen dann Stichwort2 und Stichwort3 stehen. Eins der beiden ist dann eventuell leer, weil ich ja eine or-Verknüpfung gewählt habe.
                  also meintest du deine abfrage nicht so, wie du sie formuliert hast!

                  PHP-Code:
                  $stichwort1=='' and $stichwort2!='' or $stichwort3!='' 
                  heisst:
                  stichwort1 muss leer sein und stichwort2 nicht leer
                  (und/oder)
                  stichwort3 nicht leer.

                  wie gesagt, AND bindet stärker als OR.


                  was du gemeint hast, ist
                  PHP-Code:
                  $stichwort1=='' and ($stichwort2!='' or $stichwort3!=''
                  aber das ist eben nicht das selbe.

                  durch die klammern wird jetzt das OR zuerst berücksichtigt.


                  tipp: beschäftige dich noch mal ein bisschen mit logischen ausdrücken.
                  I don't believe in rebirth. Actually, I never did in my whole lives.

                  Kommentar


                  • #10
                    Vielen Dank, dass Du mich nochmal auf die Logik aufmerksam gemacht hast. Das ist mir leider vorher nicht aufgefallen.

                    Diese Klammern scheinen mein Problem tatsächlich gelöst zu haben. Ohne sie wurde wohl verhindert, dass der else-Zweig richtig ausgeführt wird, weil die Bedingung schon vorher erfüllt war.

                    Hurra!!!

                    Kommentar

                    Lädt...
                    X