Gerd H.: Left Join keine Ergebnisse

Hallo Forengemeinde,

Es geht um ein kleines Script, welches mir die Anzahl an Klicks anzeigt. Die Klicks sollen nur angezeigt werden, wenn diese in einer Rechnung begkichen wurden. Ich beschäftige mich nun seit längerem mit einer Abfrage:

  
SELECT p.id, p.domain  
FROM partners p  
LEFT JOIN p_rechnung r ON p.id=r.partner_id  
LEFT JOIN p_klick k ON k.partner_id=r.partner_id  
WHERE r.status = '1'  
AND r.typ = '0'  
GROUP BY p.id  
HAVING SUM( r.anzahl ) > SUM( k.klicks )  
ORDER BY RAND()  
LIMIT 1  

Jedoch erhalte ich keine Ergebnisse, wenn in der Tabelle p_klick keine Datensätze sind. Am Anfang sollen allerdings auch keine sein. Diese sollen erst beim ersten Klick angelegt werden.

Wäre toll, wenn mir jemand einen Denkanstoß oder eine Hilfe gibt.

  1. Hallo,

    nur mal ganz dumm nachgefragt, wozu "ORDER BY RAND()" und "LIMIT 1"? Willst du wirklich nur einen einzigen zufälligen anzeigen?

    Als generellen Rat möchte ich dir mitgeben, wenn du ein Problem mit einer SQL Abfrage hast (eben z.b. keine Ergebnisse) dann vereinfache erstmal deine Abfrage rückwärts bis du wieder Ergebnisse bekommst und gehe dann wieder schrittweise vorwärts bei den Einschränkungen (WHERE und HAVING) und lasse unwesentliche Dinge wie Sortierung oder Limitierung erstmal weg, das lenkt nur ab. :)

    Vielleicht solltest auch du mögliche Nullwerte in p_klick durch 0 ersetzen und diese dann summieren.

    Ciao, Frank

    1. nur mal ganz dumm nachgefragt, wozu "ORDER BY RAND()" und "LIMIT 1"? Willst du wirklich nur einen einzigen zufälligen anzeigen?

      Weil mir bei der Abfrage genau ein zufälliger Datensatz angezeigt werden soll. Es wrid am Ende ja auf der Seite auch nur genau ein Banner eingebunden.

      Vielleicht solltest auch du mögliche Nullwerte in p_klick durch 0 ersetzen und diese dann summieren.

      In einer Abfrage? Es ist ja auch so, dass ein Nullwert herauskommt...das weiß ich, aber wir ersetze ich durch 0? Habe davon noch ncihts gelesen.

      1. Hallo

        Vielleicht solltest auch du mögliche Nullwerte in p_klick durch 0 ersetzen und diese dann summieren.

        In einer Abfrage? Es ist ja auch so, dass ein Nullwert herauskommt...das weiß ich, aber wir ersetze ich durch 0? Habe davon noch ncihts gelesen.

        Du verwendest mit hoher Wahrscheinlichkeit MySQL, da jedes andere mir bekannte Datenbankmanagementsystem Dein Statement als syntaktisch falsch zurückweisen würde. Aber auch MySQL kennt COALESCE:

        Nullwerte im Feld feldname kannst Du somit mit

        ... COALESCE(feldname, 0) ...

        durch 0 ersetzen.

        Freundliche Grüße

        Vinzenz

        1. Nullwerte im Feld feldname kannst Du somit mit

          ... COALESCE(feldname, 0) ...

          durch 0 ersetzen.

          Ich danke dir, das ist wonach ich gesucht habe.

      2. In einer Abfrage? Es ist ja auch so, dass ein Nullwert herauskommt...das weiß ich, aber wir ersetze ich durch 0? Habe davon noch ncihts gelesen.

        Ok jetzt habe ich etwas davon gelesen...das was gemeint war, ist wohl NVL(spalte,0). Funktioniert leider bei mir nicht...

          
        SELECT p.id, p.domain  
        FROM partners p  
        LEFT JOIN p_rechnung r ON p.id=r.partner_id  
        LEFT JOIN p_klick k ON k.partner_id=r.partner_id  
        WHERE r.status = '1'  
        AND r.typ = '0'  
        GROUP BY p.id  
        HAVING SUM( r.anzahl ) > SUM(NVL(k.klicks,0))  
        ORDER BY RAND()  
        LIMIT 1