kondry: SQL Abfrage

Hallo zusammen!

Folgende SQL Abfrage funktioniert leider nicht. Es sollen alle Datensätze der Tabelle rezepte gefunden werden, welchen in Tabelle zutaten  die Zutaten w und w2 zugeordnet sind. Lasse ich die Verknüpfung AND oder OR weg, funktioniert diese Abfrage einwandfrei.

  
$sql = "SELECT SQL_CALC_FOUND_ROWS rezepte.*  
        FROM rezepte  
        LEFT JOIN zutaten  
        ON zutaten.rezept_id = rezepte.id  
        WHERE zutaten.zutat = '".mysql_real_escape_string($_GET['w'])."'  
        AND zutaten.zutat = '".mysql_real_escape_string($_GET['w2'])."'  
        ORDER BY rezept LIMIT ".$Nrstart.",11";  

Wie müsste die Abfrage richtig heißen?

Vielen lieben Dank für Eure Hilfe!

  1. Hi kondry!

    Wie müsste die Abfrage richtig heißen?

    Wie sieht die Abfrage denn aus?
    Also welche Abfrage wird wirklich an das DBMS (MySQL 5.1?) geschickt?

    MfG H☼psel

    --
    "It's amazing I won. I was running against peace, prosperity, and incumbency."
    George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
    Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
    1. Hi kondry!

      »» Wie müsste die Abfrage richtig heißen?
      Wie sieht die Abfrage denn aus?
      Also welche Abfrage wird wirklich an das DBMS (MySQL 5.1?) geschickt?

      MfG H☼psel

      Hey,

      ja, ist eine SQL DB. Aber ich muss gestehen, ich verstehe deine Frage nicht ganz. Was meinst du mit: welche Abfrage wird gesendet?

      1. Hi!

        Was meinst du mit: welche Abfrage wird gesendet?

        Das geht in Richtung
        Zitat 1353

        off:PP

        --
        "You know that place between sleep and awake, the place where you can still remember dreaming?" (Tinkerbell)
        1. Hi!

          »» Was meinst du mit: welche Abfrage wird gesendet?

          Das geht in Richtung
          Zitat 1353

          off:PP

          Hallo zusammen!

          Das Zitat kann ich nicht öffnen, benötige ein PSW.

          Es ist ganz einfach so:
          ich habe mir diese Abfrage mit Mühe zusammen gebastelt; ich bin nicht so ein Profi wie Ihr. Jetzt stelle ich eine Frage - die offensichtlich in Euren Augen nicht nur laienhaft, sondern auch noch zu Unrecht gestellt wurde - und erhalte eine Menge Antworten, die mir nicht wirklich weiterhelfen. Danke schon mal für den Link zur Verwendung der Operatoren.

          Wenn Ihr nicht helfen wollt, dann lasst es doch einfach.

          Ich bin keiner der Besucher:
          "hey, ich brauche ein fertiges Skript, wer hat Zeit es mir zu schreiben? Natürlich unentgeltlich..."

          Sondern einfach nur ein "Hilfesuchender".

          Grüße

          1. Ach Kondry!

            Wenn Ihr nicht helfen wollt, dann lasst es doch einfach.

            Wir wollen doch helfen. Aber dafür musst du uns schreiben, wie das zusammengesetzte SQL-Statement wirklich aussieht.

            Beispiel:
            Nicht hilfreich:
            $sql = 'SELECT P.id,P.name FROM Person P WHERE id = '.$userID;

            Hilfreich:
            SELECT P.id,P.name FROM Person P WHERE id = '7

            Begründung:
            Im hilfreichen Beispiel sieht man den Fehler. Im ersten kann man nur vermuten, _dass_ der Fehler bei $userID liegt, nicht aber was genau falsch ist.

            MfG H☼psel

            --
            "It's amazing I won. I was running against peace, prosperity, and incumbency."
            George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
            Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
          2. Hallo,

            »» Hi!
            »» [...]
            »» off:PP

            was die freundliche Aufforderung bedeutet, keine Fullquotes zu produzieren, verstehst du aber?

            Das Zitat kann ich nicht öffnen, benötige ein PSW.

            Nein, du brauchst nur einen korrekt gesetzten Link, da hat Peter Pan nicht aufgepasst:

            »» Zitat 1353

            ich habe mir diese Abfrage mit Mühe zusammen gebastelt; ich bin nicht so ein Profi wie Ihr. Jetzt stelle ich eine Frage

            ... und wir stellen die eine oder andere Gegenfrage, weil deine ursprüngliche Frage nicht genug Information enthält, und du antwortest nur ausweichend oder gar nicht.

            und erhalte eine Menge Antworten, die mir nicht wirklich weiterhelfen.

            Dann frage doch konkret nach. Eine Kernfrage war: Wie lautet genau die Anfrage, die du an die DB sendest? Du hast uns bisher nur den PHP-Code gezeigt, der diese Anfrage erzeugt, und der dabei weitere, uns unbekannte Daten mit einbaut:

            $sql = "SELECT SQL_CALC_FOUND_ROWS rezepte.*

            FROM rezepte
                    LEFT JOIN zutaten
                    ON zutaten.rezept_id = rezepte.id
                    WHERE zutaten.zutat = '".mysql_real_escape_string($_GET['w'])."'
                    AND zutaten.zutat = '".mysql_real_escape_string($_GET['w2'])."'
                    ORDER BY rezept LIMIT ".$Nrstart.",11";

              
            Mal angenommen, $\_GET['w'] und $\_GET['w2'] seien unterschiedlich:  
            Wie kann \*ein\* Wert, der aus der DB abgefragt wird, beispielsweise \*gleichzeitig\* "Zucker" und "Pfeffer" lauten? Ganz klar, du meintest kein "und", sondern ein "oder".  
              
            
            > Wenn Ihr nicht helfen wollt, dann lasst es doch einfach.  
              
            Wenn du Antworten nicht verstehst, hake nach.  
              
            Ciao,  
             Martin  
            
            -- 
            Der Mensch denkt, Gott lenkt.  
            Der Mensch dachte, Gott lachte.
            
          3. Hi!

            » »» Was meinst du mit: welche Abfrage wird gesendet?
            »
            » Das geht in Richtung
            » Zitat 1353

            Das Zitat kann ich nicht öffnen, benötige ein PSW.

            Das war my Fehler, so geht's: Zitat 1353

            ich habe mir diese Abfrage mit Mühe zusammen gebastelt; ich bin nicht so ein Profi wie Ihr. Jetzt stelle ich eine Frage - die offensichtlich in Euren Augen nicht nur laienhaft, sondern auch noch zu Unrecht gestellt wurde - und erhalte eine Menge Antworten, die mir nicht wirklich weiterhelfen.

            Nein, das verstehst du falsch - oben stand mein Tipp mit echo $sql;
            Damit erhälst du die Query, welche an den DB-Server gesendet wird, zudem wäre eine evtl. MySQL-Fehlermeldung interessant.

            off:PP

            --
            "You know that place between sleep and awake, the place where you can still remember dreaming?" (Tinkerbell)
            1. echo $sql;[/code]

              ergibt:

              SELECT SQL_CALC_FOUND_ROWS rezepte.* FROM rezepte LEFT JOIN zutaten ON zutaten.rezept_id = rezepte.id WHERE zutaten.zutat = 'Krabben' AND zutaten.zutat = 'Zwiebel' ORDER BY rezept LIMIT 0,11

              1. Hallo,

                SELECT SQL_CALC_FOUND_ROWS rezepte.* FROM rezepte LEFT JOIN zutaten ON zutaten.rezept_id = rezepte.id WHERE zutaten.zutat = 'Krabben' AND zutaten.zutat = 'Zwiebel' ORDER BY rezept LIMIT 0,11

                siehste, und wie kann nun zutaten.zutat gleichzeitig "Krabben" UND "Zwiebel" sein? Du meinst "oder", nicht "und".

                Ciao,
                 Martin

                --
                Die letzten Worte des Architekten:
                Mir fällt da gerade was ein...
                1. Hallo,

                  » SELECT SQL_CALC_FOUND_ROWS rezepte.* FROM rezepte LEFT JOIN zutaten ON zutaten.rezept_id = rezepte.id WHERE zutaten.zutat = 'Krabben' AND zutaten.zutat = 'Zwiebel' ORDER BY rezept LIMIT 0,11

                  siehste, und wie kann nun zutaten.zutat gleichzeitig "Krabben" UND "Zwiebel" sein? Du meinst "oder", nicht "und".

                  günstiger erscheint mir

                    WHERE  
                        zutaten.zutat [link:http://dev.mysql.com/doc/refman/5.1/en/comparison-operators.html#function_in@title=IN] ('Krabben', 'Zwiebeln')
                  

                  Außerdem möchte der OP sicherlich, dass ein Rezept nur einmal angezeigt wird, auch wenn mehrere Zutaten aus der Zutatenliste passen. Deswegen rate ich zum Einsatz von

                  [link:http://dev.mysql.com/doc/refman/5.1/en/select.html@title=SELECT DISTINCT]

                  oder zur Verwendung eines Subselects statt des LEFT JOINs, der sowieso besser ein INNER JOIN wäre:

                  SELECT              -- Gib mir  
                      *               -- alle Spalten  
                  FROM                -- aus  
                      rezepte         -- der Tabelle rezepte  
                  WHERE               -- wobei nur solche Datensätze berücksichtigt werden,  
                      id IN (         -- deren ID in der Liste der IDs vorkommt  
                      SELECT          -- die  
                          rezept_id   -- aus den rezept_ids besteht  
                      FROM            -- in deren  
                          zutaten     -- Zutaten  
                      WHERE           -- die gesuchten  
                          zutat IN ('Krabben', 'Zwiebeln')  -- Krabben oder Zwiebeln enthalten sind  
                  )  
                  
                  

                  Freundliche Grüße

                  Vinzenz

                  1. Hallo,

                    vielen Dank für deine Antwort! An einer Lösung mit IN saß ich gerade. Hatte dies in der Liste der Operatoren "gefunden". Allerdings hätte ich es nur oben ersetzt. Deine Lösung ist da weitaus schöner. Zur einmaligen Aneige des Rezeptes habe ich GROUP BY rezept verwendet.

                    Vielen Dank.

                2. siehste, und wie kann nun zutaten.zutat gleichzeitig "Krabben" UND "Zwiebel" sein?

                  Hallo,

                  mhhh... irgendwie haben wir uns mißverstanden, bzw ich habe mich falsch ausgedrückt.

                  Die Verwendung von OR, AND ist mir klar - insbesondere, nachdem ich den Link noch studiert habe. Meine Abfrage scheint einfach eine falsche Grundlage zu sein.

                  Bei der OR Verknüpfung klappt es. Bei AND will ich aber was anderes erreichen:

                  Tabelle rezepte:
                  id | rezept
                  1  | Kuchen
                  2  | Lasagne
                  3  | Auflauf
                  4  | Auflauf 2

                  Tabelle zutaten:
                  id | rezept_id | Zutat
                  1  | 2         | Lasagne Blätter
                  2  | 2         | Tomaten
                  3  | 2         | Kapern
                  4  | 1         | Tomaten
                  5  | 3         | Tomaten
                  6  | 3         | Kapern
                  7  | 4         | Tomaten
                  8  | 4         | Kapern

                  Die Suche mit Opertaor AND sollte in diesem BSP nun mit den Werten
                  Tomaten und Kapern
                  die Rezepte
                  3 und 4
                  finden, da nur für diese beiden genau die Zutaten benötigt werden. Eine andere Alternative müsste dann noch sein, dass auch Rezept 1 gefunden würde, da auch hier die beiden Zutaten enthalten sind.

                  Ich hoffe, ich konnte es verdeutlichen.

                  Grüße

                  1. Hallo,

                    für den AND-Fall hätte ich auch was zu bieten.

                    Tabelle zutaten:
                    id | rezept_id | Zutat
                    1  | 2         | Lasagne Blätter
                    2  | 2         | Tomaten
                    3  | 2         | Kapern
                    4  | 1         | Tomaten
                    5  | 3         | Tomaten
                    6  | 3         | Kapern
                    7  | 4         | Tomaten
                    8  | 4         | Kapern

                    Die Suche mit Opertaor AND sollte in diesem BSP nun mit den Werten
                    Tomaten und Kapern
                    die Rezepte
                    3 und 4
                    finden, da nur für diese beiden genau die Zutaten benötigt werden. Eine andere Alternative müsste dann noch sein, dass auch Rezept 1 gefunden würde, da auch hier die beiden Zutaten enthalten sind.

                    schau' Dir meine Ausführungen in diesem Archivbeitrag an. Diese passen meiner Meinung nach exakt auf Dein Problem (kleiner Join auf die Rezepte käme noch dazu).

                    Freundliche Grüße

                    Vinzenz

                    1. schau' Dir meine Ausführungen in diesem Archivbeitrag an. Diese passen meiner Meinung nach exakt auf Dein Problem (kleiner Join auf die Rezepte käme noch dazu).

                      Danke für den Link! Ich werde es mir in Ruhe anschauen und meld mich dann wieder! Vielen lieben Dank!

      2. Bitte keine Fullquotes.

        ja, ist eine SQL DB.

        Hospel hat dich gefragt, welches DBMS du verwendest (MySQL 5.1) und du gibst als Antwort, "Ja, es ist eine SQL DB". Ist es jetzt eine MySQL-Datenbank oder nicht?

        Q: "Welches Obst ist du gerne (Äpfel)?"
        A: Ja, ich mag Obst!

        SCNR

        1. Q: "Welches Obst ist du gerne (Äpfel)?"
          A: Ja, ich mag Obst!

          ;-)

          MYSQL 5.1

          Die Abfrage habe ich doch gepostet?!

          Ich habe zwei Tabellen: rezepte und zutaten
          Die Abfrage soll erreichen, dass nur die Rezepte gefunden werden, welche die bestimmten angegebenen Zutaten beinhalten. In der Tabelle zutaten verweist die Spalte rezept_id auf die id des entsprechenden Rezeptes.

          Die (zum Testen erstmal) zwei Zutaten werden über die GET Variablen w und w2 ermittelt.

          Die obige Abfrage funktioniert, wenn ich nur einen Wert (w) abfrage. Es sollen nun aber alle Werte (Zutaten) berücksichtigt werden. Hier will ich dann später noch den Code erweitern um die Möglichkeit der Suche: und / oder...

          Ich hoffe, ich konnte soweit alles gut beschreiben?

          1. Hey,

            hier ein BSP für die Abfrage:

              
            $sql = "SELECT SQL_CALC_FOUND_ROWS rezepte.*  
                    FROM rezepte  
                    LEFT JOIN zutaten  
                    ON zutaten.rezept_id = rezepte.id  
                    WHERE zutaten.zutat = 'Huhn'  
                    AND zutaten.zutat = 'Mango'  
                    ORDER BY rezept LIMIT 1,11";  
              
            $Rez_res = mysql_query($sql);  
            
            

            Hier sollen jetzt die Rezepte gefunden werden, welche als Zutat mindestens Mongo und Huhn haben.

            Grüße

            1. Hier sollen jetzt die Rezepte gefunden werden, welche als Zutat mindestens Mongo und Huhn haben.

              Nein - wie bereits von mir erwähnt möchtest du dich mit logischen Operatoren beschäftigen. Zudem hat Hospel dasselbe erwähnt und du hast dich für den Tipp bedankt - scheinbar hast du aber nicht versucht, diese Hilfe wahrzunehmen.

      3. Hi Kondry!

        ja, ist eine SQL DB.

        Hast du ´ne Ahnung, wieviel SQL-Datenbankmanagementsysteme es gibt?!
        Welches verwendest du?

        Aber ich muss gestehen, ich verstehe deine Frage nicht ganz. Was meinst du mit: welche Abfrage wird gesendet?

        Ja, wie Peter schon schrieb: Wie sieht der SQL-Code aus und was soll er konkret ermitteln?

        Oder um dich mal direkt darauf zu stoßen: Was meinst du mit

        zutaten  die Zutaten w und w2 zugeordnet sind

        ?

        Meinst du wirklich "und", meinst du "oder" oder meinst du "explizit oder"?

        MfG H☼psel

        --
        "It's amazing I won. I was running against peace, prosperity, and incumbency."
        George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
        Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
  2. Folgende SQL Abfrage funktioniert leider nicht.

    Funktioniert leider nicht, funktioniert auch nicht.

    Wie müsste die Abfrage richtig heißen?

    Was sagt die Fehlerbehandlung von MySQL dazu?

    Aber weil ich vorgreifen möchte: du möchtest dich vielleicht über logische Operatoren, insbesondere die Bedeutung von UND und ODER, informieren.

  3. Hi!

    $sql = "SELECT SQL_CALC_FOUND_ROWS rezepte.*
            FROM rezepte
            LEFT JOIN zutaten
            ON zutaten.rezept_id = rezepte.id
            WHERE zutaten.zutat = '".mysql_real_escape_string($_GET['w'])."'
            AND zutaten.zutat = '".mysql_real_escape_string($_GET['w2'])."'
            ORDER BY rezept LIMIT ".$Nrstart.",11";

      
    Du solltest Die Get-Parameter noch prüfen, bevor Du sie verwendest.  
      
    
    > Wie müsste die Abfrage richtig heißen?  
      
    Wie lautet sie denn jetzt?  
    Was sagt ein ` echo $sql;`{:.language-php}?  
      
      
    off:PP  
      
      
    
    -- 
    "You know that place between sleep and awake, the place where you can still remember dreaming?" (Tinkerbell)