Ingo: Mehrere Bedingungen

Hallo,

ich arbeite gerade an einer internen Suche um Produkte schneller zu finden und bearbeiten zu können. Meine SELECT Abfrage findet die bestimmten Artikel, wenn ich diese einzeln abfrage, nur wenn ich alle 3 kombiniere zeigt er den letzten aus der DB.

Meine Abfrage:
$result = mysql_query("SELECT id,ident,produkt FROM produkt WHERE (produkt LIKE '%$produkt%')or(id LIKE '%$id%')or(ident LIKE '%$ident%') ");

Kann mir Jemand sagen wie das richtig abgefragt werden muß, Danke.

  1. Hallo Ingo,

    Wenn Du mit 'OR' arbeitest hoert die Datenbank bei einer Uebereinstimmung auf weil die WHERE-Klausel wahr wird.
    Du musst sie also anweisen alle Treffer zu suchen.
    Z.B. so:
    $result = mysql_query("SELECT id, ident, produkt FROM produkt WHERE id IN ('%$id1%', '%$id2%', '%$id3%')");

    Hier stehen drei ID's in der Klammer und wenn die DB sie findet, werden sie auch ausgegeben.

    Gruss Norbert

    1. Hallo Ingo,

      Wenn Du mit 'OR' arbeitest hoert die Datenbank bei einer Uebereinstimmung auf weil die WHERE-Klausel wahr wird.
      Du musst sie also anweisen alle Treffer zu suchen.
      Z.B. so:
      $result = mysql_query("SELECT id, ident, produkt FROM produkt WHERE id IN ('%$id1%', '%$id2%', '%$id3%')");

      Hier stehen drei ID's in der Klammer und wenn die DB sie findet, werden sie auch ausgegeben.

      Gruss Norbert

      -Hallo Norbert, danke für Deine Antwort.
      -Ich suche aber aus einem Formular mit 3 Feldern id,ident,produkt nach einem Ergebnis. Die DB wird erst in Spalte id nach id gesucht wenn nicht vorhanden/ oder NULL wird Spalte ident nach ident gesucht wenn nicht vorhanden/ oder NULL eben nach Produkt. Klar bei einem Treffer hürt die Abfrage auf und giebt ein Ergebnis zurück, aber irgendwie funst das nicht.
      In deinem Fall suchst Du nur nach einer ID wenn ich das richtig sehe oder?

      Danke, Ingo

      1. n'abend,

        Wenn Du mit 'OR' arbeitest hoert die Datenbank bei einer Uebereinstimmung auf weil die WHERE-Klausel wahr wird.

        Für diesen einen Datensatz wird die Überprüfung der folgenden OR-verknpüpften Selektionskriterien abgebrochen, wenn eine der Bedinungen nach true evaluiert, korrekt.

        Du musst sie also anweisen alle Treffer zu suchen.

        Wenn das so ist, sind meine Datenbanken wohl kap0tt. Meine Datenbanken geben mir nämlich alle, die Selektionskriterien erfüllenden, Datensätze aus. Wären meine Datenbanken kap0tt, fänd' ich das aber nicht so toll, weil ich dann (bei dir) nachfragen müsste, wie ich sie reparieren könnte...

        -Ich suche aber aus einem Formular mit 3 Feldern id,ident,produkt nach einem Ergebnis. Die DB wird erst in Spalte id nach id gesucht wenn nicht vorhanden/ oder NULL wird Spalte ident nach ident gesucht wenn nicht vorhanden/ oder NULL eben nach Produkt. Klar bei einem Treffer hürt die Abfrage auf und giebt ein Ergebnis zurück, aber irgendwie funst das nicht.

        SELECT antwort FROM selfhtml WHERE farbe = "rot" OR form = "rund";

        Findet _alle_ Datensätze, die entweder rot und oder rund sind. Das sind potentiell ganz schön viele und definitiv keine Limitierung auf einen einzelnen Datensatz.

        SELECT antwort FROM selfhtml WHERE farbe = "blau" AN form = "dreieck";

        Findet _alle_ Datensätze, die blau und dreieckig sind. Das sind potentiell durchaus weniger, aber immer noch keine Limitierung auf einen einzelnen Datensatz.

        Die Query, die du Eingangs zeigtest, erfüllt meiner Meinung nach die von dir angestrebte Bedingung. Hast du dir denn mal ausgeben lassen wie die Query zusammengesetzt (also mir den jeweiligen Werten für $id, $produkt, $ident) ausschaut? Sind da überhaupt die richtigen Werte an den richtigen Stellen?

        In deinem Fall suchst Du nur nach einer ID wenn ich das richtig sehe oder?

        Eigentlich sucht er nach allen Datensätzen, die eine der IDs $id1, $id2, $id3 haben. Noch eigentlicher sucht er nach Teil-IDs. Auch wenn er dank der Prozentzeichen »%« (welche in MySQL die Wildcard-Character Bedeutung haben, sofern in einer LIKE-Condition angewendet) vermutlich überhaupt keine Datensätze lokalisieren würde.

        Danke, Ingo

        weiterhin schönen abend...

        --
        #selfhtml hat ein Forum?
        sh:( fo:# ch:# rl:| br:> n4:& ie:{ mo:} va:) de:] zu:} fl:( ss:? ls:[ js:|
    2. Hallo Herr Ingenieur,

      Wenn Du mit 'OR' arbeitest hoert die Datenbank bei einer Uebereinstimmung auf weil die WHERE-Klausel wahr wird.

      Dann würde ich die Datenbank aber wegschmeißen.
      MySQL nimmt eine vollständige Auswertung der Bedingungen in der where Klausel vor. Es wird eine Ergebnismenge geliefert und kein boolesches Ergebnis. Jedes Dataset, das eine der angereihten Bedingungen erfüllt, wird in die Ergebnismenge aufgenommen.

      MySQL optimiert das Statement aber vorher, wenn möglich.
      http://dev.mysql.com/doc/refman/5.0/en/where-optimizations.html

      Und das, was hier folgt ist auch mal wieder Schwachsinn. Aber das war zu erwarten.

      Du musst sie also anweisen alle Treffer zu suchen.
      Z.B. so:
      $result = mysql_query("SELECT id, ident, produkt FROM produkt WHERE id IN ('%$id1%', '%$id2%', '%$id3%')");

      Das entspricht in keiner Weise der Aufgabe.

      Bevor Du das nächste mal etwas zu MySQL postest, probiere es doch bitte wenigstens selber aus. Soviel Zeit muss sein, Herr Ingenieur.

      G
      Chris©

  2. Hello,

    Kann mir Jemand sagen wie das richtig abgefragt werden muß, Danke.

    ich hab dein erwartetes und erhaltenes Ergebnis noch nicht verstanden. Deine gepostete Abfrage findet alle Sätze, bei denen mindestens eines der LIKE-Kriterien zutrifft. Wenn du da nur einen Treffer kriegst, es aber eigentlich mehr Datensätze gibt, dann ist das Problem außerhalb des Queries zu suchen. Wenn du mit allen drei Kriterien genau einen Datensatz bezeichnen willst verwende AND statt OR.

    MfG
    Rouven

    --
    -------------------
    sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
    Wenn du die Nadel im Heuhaufen nicht findest, zünde den Heuhaufen an.
    1. Hello,

      Kann mir Jemand sagen wie das richtig abgefragt werden muß, Danke.
      ich hab dein erwartetes und erhaltenes Ergebnis noch nicht verstanden. Deine gepostete Abfrage findet alle Sätze, bei denen mindestens eines der LIKE-Kriterien zutrifft. Wenn du da nur einen Treffer kriegst, es aber eigentlich mehr Datensätze gibt, dann ist das Problem außerhalb des Queries zu suchen. Wenn du mit allen drei Kriterien genau einen Datensatz bezeichnen willst verwende AND statt OR.

      MfG
      Rouven

      Hi Rouven,
      danke für deine Anteilname.

      mein Ergebnis soll nur ein Treffer ausgeben, da die id und die ident nur einmal vergeben sind.

      • "Deine gepostete Abfrage findet alle Sätze,..." es geht nicht? warum auch immer? er zeigt mit gar keine Ergebnisse an obwohl diese da sind.

      Ingo

      1. Hello,

        mein Ergebnis soll nur ein Treffer ausgeben, da die id und die ident nur einmal vergeben sind.

        dann suchst du AND, wobei das kein Widerspruch ist, sondern deine Variante eher zu mehr Treffern führen sollte

        • "Deine gepostete Abfrage findet alle Sätze,..." es geht nicht? warum auch immer? er zeigt mit gar keine Ergebnisse an obwohl diese da sind.

        wie verarbeitest du das Ergebnis der Abfrage? Wie sieht das ECHTE Statement, also bereinigt von PHP-Variablen, aus?

          
        $sql = "SELECT id,ident,produkt FROM produkt WHERE (produkt LIKE '%$produkt%')or(id LIKE '%$id%')or(ident LIKE '%$ident%') ";  
        echo $sql;  
        $result = mysql_query($sql);  
        
        

        Hast du das Statement mal direkt gegen die Datenbank abgesetzt?

        MfG
        Rouven

        --
        -------------------
        sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
        Inter Arma Enim Silent Leges  --  Cicero
        1. n'abend,

          mein Ergebnis soll nur ein Treffer ausgeben, da die id und die ident nur einmal vergeben sind.
          dann suchst du AND, wobei das kein Widerspruch ist, sondern deine Variante eher zu mehr Treffern führen sollte

          Wenn ich ihn richtig verstanden habe, hat er _eine_ Eingabe, die entweder die ID, oder der Produktname oder der Ident (was auch immer das sein soll) sein kann. Dementsprechend ist er mit OR-verknüpften Bedingungen eigentlich nicht auf dem Holzweg. Sollte das nicht der Fall sein, sollte er also mit unabhängigen Eingaben für die einzelnen Felder arbeiten, macht die Query keinen Sinn, wenn er ohnehin nur einen einzelnen Datensatz identifizieren will - da wäre er besser bedient, würde er für jede Eingabeform eine eigenständige Query abfeuern, eben je nach dem was rein kam.

          weiterhin schönen abend...

          --
          #selfhtml hat ein Forum?
          sh:( fo:# ch:# rl:| br:> n4:& ie:{ mo:} va:) de:] zu:} fl:( ss:? ls:[ js:|
          1. Hello,

            Wenn ich ihn richtig verstanden habe, hat er _eine_ Eingabe, die entweder die ID, oder der Produktname oder der Ident

            okay, wenn man es so liest, dann ist OR natürlich richtig. Wobei dann sichergestellt sein muss, dass die Eingabe IMMER ausreicht, um genau einen Satz zu liefern - 3 Kandidatenschlüssel ist einer Tabelle? Das ist ne Menge...
            Ansonsten ist der Programmablauf falsch, sofern er sich darauf verlässt, dass unabhängig von der Eingabe nur ein Datensatz gefunden wird.

            MfG
            Rouven

            --
            -------------------
            sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
            Wenn du die Nadel im Heuhaufen nicht findest, zünde den Heuhaufen an.
            1. n'abend,

              Hello,

              Wenn ich ihn richtig verstanden habe, hat er _eine_ Eingabe, die entweder die ID, oder der Produktname oder der Ident
              okay, wenn man es so liest, dann ist OR natürlich richtig. Wobei dann sichergestellt sein muss, dass die Eingabe IMMER ausreicht, um genau einen Satz zu liefern - 3 Kandidatenschlüssel ist einer Tabelle? Das ist ne Menge...

              naja, jein. Er kann auch mehrere Datensätze finden, er weiß es nur noch nicht. Gibt er einen Teil einer Produktbezeichnung ein, will er vermulich alle Artikel sehen, die Eingabe enthalten. Wenn er jedoch eine explizite ID angibt, ist _ein_ Datensatz zu identifizieren.

              weiterhin schönen abend...

              --
              #selfhtml hat ein Forum?
              sh:( fo:# ch:# rl:| br:> n4:& ie:{ mo:} va:) de:] zu:} fl:( ss:? ls:[ js:|
              1. Hello,

                naja, jein. Er kann auch mehrere Datensätze finden, er weiß es nur noch nicht. Gibt er einen Teil einer Produktbezeichnung ein, will er vermulich alle Artikel sehen, die Eingabe enthalten. Wenn er jedoch eine explizite ID angibt, ist _ein_ Datensatz zu identifizieren.

                Ingo!! Wo bist du?
                Ich hab seine letzte Aussage so verstanden, dass er schon erwartet, dass es genau einen gibt. Das ist allerdings dann ein Widerspruch zur Herangehensweise uneindeutige Suchkriterien zu verwenden. Man müsste eine Trefferliste dazwischenschalten...

                MfG
                Rouven

                --
                -------------------
                sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
                Death is nature's way of telling you to slow down.