Gerd H.: MYSQL Abfrage Fehler?

Hallo,

ich komme einfach nicht weiter...folgende Abfrage gibt mir ein falsches Ergebnis:

  
SELECT r.link, SUM(v.views) , SUM(r.anzahl)  
FROM p_view v, p_rechnung AS r  
WHERE r.status = '1'  
AND r.typ = '1'  
AND v.partner_id = r.partner_id  
GROUP BY v.partner_id  

Ich erhalte für beide "SUM()" 300000, obwohl ich für SUM(v.views) 150000 erhalten müsste. In der Tabelle p_view sind auch nur ein Eintrag mit views=150000.

Wo liegt der Fehler? Wäre echt dankbar für jeden Ratschlag. Danke

  1. hi,

    Ich erhalte für beide "SUM()" 300000, obwohl ich für SUM(v.views) 150000 erhalten müsste. In der Tabelle p_view sind auch nur ein Eintrag mit views=150000.

    Mit

    FROM p_view v, p_rechnung AS r

    bildest du sowas wie ein Kreuzprodukt - also ist in der Menge, über die du summierst, _nicht_ nur ein Datensatz mit v.views=150000 vorhanden, sondern  - wenn p_rechnung zwei Datensätze zum Ergebnis beisteuert - derer zwei.

    150.000 + 150.000 = 300.000

    Beschäftige dich mit JOINs.
    http://aktuell.de.selfhtml.org/artikel/datenbanken/joins/

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. yo,

      bildest du sowas wie ein Kreuzprodukt

      nicht ganz, da er in der WHERE klausel die JOIN Bedingung reingeschrieben hat: AND v.partner_id = r.partner_id

      aber ich vermute mal wie du, dass er zwei datensätze durch den JOIN bekommt, die dann in der summe 300.000 ergeben.

      kleiner tipp noch, du gibst spalten aus, die keine aggregat-funktionen sind und nicht in die grupppierung mit aufgenommen wurden. alle dbms ausser mysql spucken darauf hin eine fehlmeldung aus.

      Ilja

      1. aber ich vermute mal wie du, dass er zwei datensätze durch den JOIN bekommt, die dann in der summe 300.000 ergeben.

        Irgendwie verstehe ich das nicht...warum bekomme ich 2 Datensätze?

        kleiner tipp noch, du gibst spalten aus, die keine aggregat-funktionen sind und nicht in die grupppierung mit aufgenommen wurden. alle dbms ausser mysql spucken darauf hin eine fehlmeldung aus.

        Müssen die dann utner GROUP BY stehen? Dann erhalte ich doch aber nicht die SUmme der Datensätze sondern einen Wert?!?

  2. Ich habe jetzt eine wirklich schlechte Lösung gebastelt...

      
    SELECT r.link, SUM(v.views)/COUNT(r.anzahl) , SUM(r.anzahl)  
    FROM p_view v, p_rechnung AS r  
    WHERE r.status = '1'  
    AND r.typ = '1'  
    AND v.partner_id = r.partner_id  
    GROUP BY v.partner_id  
    
    

    Kann mir keiner helfen? :)

    1. Hallo Gerd,

      Kann mir keiner helfen? :)

      poste doch bitte ein paar Beispieldatensätze und gib' an, welches Ergebnis Du erwartest - und warum Du dies erwartest.

      Weiterhin wäre es eine gute Idee, Deine MySQL-Version bekanntzugeben. Die Leistungsfähigkeit von MySQL unterscheidet sich enorm zwischen den verschiedenen Versionen.

      Freundliche Grüße

      Vinzenz

      1. poste doch bitte ein paar Beispieldatensätze und gib' an, welches Ergebnis Du erwartest - und warum Du dies erwartest.

        Was ich erwarte kannst Du in meinem anderen Beitrag sehen.

        Deine MySQL-Version

        Mysql_version: 4.1

        1. Hallo

          poste doch bitte ein paar Beispieldatensätze und gib' an, welches Ergebnis Du erwartest - und warum Du dies erwartest.
          Was ich erwarte kannst Du in meinem anderen Beitrag sehen.

          Nein, ich möchte Deine Tabellen sehen, ich möchte Datensätze in diesen Tabellen sehen - und ich möchte die zu diesen Datensätzen passenden Ergebnisse sehen.

          Ich möchte _kein_ SQL-Statement sehen, dessen Sinn ich aufgrund fehlender Informationen eh' nicht einsehe.

          Deine MySQL-Version

          Das ist gut, die kann bereits Subselects. Möglicherweise wirst Du diese benötigen. Ohne jedoch einen Einblick in Deine Daten zu haben, kann ich das nicht beurteilen.

          Freundliche Grüße

          Vinzenz

          1. Das ist gut, die kann bereits Subselects. Möglicherweise wirst Du diese benötigen. Ohne jedoch einen Einblick in Deine Daten zu haben, kann ich das nicht beurteilen.

              
            Tabelle p_rechnung  
            id | partner_id |  anzahl  | status |  typ  
            1  | 2          | 100000   | 1      | 1  
            1  | 2          | 200000   | 1      | 1  
              
            Tabelle p_view  
            id | partner_id | views  
            1  | 2          | 150000  
              
            Tabelle partners  
            id | domain    | email | session | klick | view  
            2  | domain.de | | | 1 | 1  
            
            

            So und hier nochmal die Abfrage:

              
            SELECT p.id, p.domain  
            FROM partners p  
            LEFT JOIN p_rechnung r ON p.id=r.partner_id  
            LEFT JOIN p_view v ON p.id=v.partner_id  
            WHERE r.status = '1'  
            AND r.typ = '1'  
            GROUP BY p.id  
            HAVING SUM( r.anzahl ) > SUM(COALESCE(v.views))/COUNT( r.anzahl )  
            ORDER BY RAND()  
            LIMIT 1  
            
            

            Ok hier Erklärungen:
            r.status -> Rechnungsstatus (1 bezahlt)
            r.typ -> Views
            r.anzahl -> Anzahl der Views, die ein Werbepartner haben möchte

            Ich möchte das auf meiner Seite Werbebanner eingebunden werden. Allerdings nur so lange wie bezahlte Bannerimpressionen(Views) vorhanden sind. Schwer zu erklären jetzt.

  3. SELECT r.link, SUM(v.views) , SUM(r.anzahl)
    FROM p_view v, p_rechnung AS r
    WHERE r.status = '1'
    AND r.typ = '1'
    AND v.partner_id = r.partner_id
    GROUP BY v.partner_id

    
    >   
    > Ich erhalte für beide "SUM()" 300000, obwohl ich für SUM(v.views) 150000 erhalten müsste.  
      
    Woher weisst Du eigentlich welchen Wert Du erhalten solltest?  
    Ansonsten mal die Abfrage mit einem JOIN und kompletter GROUP BY-Klausel optimieren, zudem einfach mal die Bedeutung der Datenfelder und die genaue Zeilsetzung beschreiben.
    
    1. Woher weisst Du eigentlich welchen Wert Du erhalten solltest?
      Ansonsten mal die Abfrage mit einem JOIN und kompletter GROUP BY-Klausel optimieren, zudem einfach mal die Bedeutung der Datenfelder und die genaue Zeilsetzung beschreiben.

      Weil ich in p_view nur einen Datensatz habe und in dem Feld views 150000 steht. Deswegen müsste da auch nciht 300000 als Ergebnis augegeben werden.

      Also hier meine aktuelle Abfrage komplett und nicht vereinfacht:

        
      SELECT p.id, p.domain, r.link  
      FROM partners p  
      LEFT JOIN p_rechnung r ON p.id=r.partner_id  
      LEFT JOIN p_view v ON p.id=v.partner_id  
      WHERE r.status = '1'  
      AND r.typ = '1'  
      GROUP BY p.id  
      HAVING SUM( r.anzahl ) > SUM(COALESCE(v.views))/COUNT( r.anzahl )  
      ORDER BY RAND()  
      LIMIT 1  
      
      

      Ich möchte einen Datensatz haben bei dem die Summe von r.anzahl größer als die Summe der views ist.

      1. Also hier meine aktuelle Abfrage komplett und nicht vereinfacht:

        SELECT p.id, p.domain, r.link
        FROM partners p
        LEFT JOIN p_rechnung r ON p.id=r.partner_id
        LEFT JOIN p_view v ON p.id=v.partner_id
        WHERE r.status = '1'
        AND r.typ = '1'
        GROUP BY p.id
        HAVING SUM( r.anzahl ) > SUM(COALESCE(v.views))/COUNT( r.anzahl )
        ORDER BY RAND()
        LIMIT 1

        
        >   
        > Ich möchte einen Datensatz haben bei dem die Summe von r.anzahl größer als die Summe der views ist.  
          
        Also, wie gesagt, das ist jetzt eine nette neue und ganz andere komplexe und lustige Abfrage, aber verstehen tue ich diese nicht und - noch schlimmer - ich verstehe nicht, was Du überhaupt erreichen willst.  
          
        Du würdest nichts verkehrt machen, wenn Du Datendesign, dessen Bedeutung und die Zielsetzung der angestrebten Abfrage möglichst genau beschreiben würdest. (BTW - ist die o.g. Abfrage von Dir oder zusammengeclickt?)
        
        1. (BTW - ist die o.g. Abfrage von Dir oder zusammengeclickt?)

          Die ist wirklich von mir selbst erstellt.

          1. hi,

            (BTW - ist die o.g. Abfrage von Dir oder zusammengeclickt?)

            Die ist wirklich von mir selbst erstellt.

            Hältst du es für zielführend, dir aus der jetzt auch von King Lully noch mal wiederholten Frage nach deinen Daten, Aufbau etc. ausschliesslich diese belanglose Frage zur Beantwortung herauszupicken?

            gruß,
            wahsaga

            --
            /voodoo.css:
            #GeorgeWBush { position:absolute; bottom:-6ft; }
            1. (BTW - ist die o.g. Abfrage von Dir oder zusammengeclickt?)

              Die ist wirklich von mir selbst erstellt.

              Hältst du es für zielführend, dir aus der jetzt auch von King Lully noch mal wiederholten Frage nach deinen Daten, Aufbau etc. ausschliesslich diese belanglose Frage zur Beantwortung herauszupicken?

              Vielleicht kriegen wir zu dritt die Frage in den Griff?!

              BTW - King Lully ist von einem Störer (vermutlich der Gunnar Bittermann-Spammer, dem ich mal kurz geantwortet habe ;) reserviert worden, darum ist der Name länger geworden. Und - Vorsicht! - der kann noch viel viel länger werden!   ;)

              1. BTW - King Lully ist von einem Störer (vermutlich der Gunnar Bittermann-Spammer, dem ich mal kurz geantwortet habe ;) reserviert worden, darum ist der Name länger geworden.

                Wenn ich Gunnar wäre, wüsste ich, wie ich jetzt reagieren würde.

                Und - Vorsicht! - der kann noch viel viel länger werden!   ;)

                "Vorsicht!"? Naja, manch ein Poster macht sich so zum Klops, wie er nur kann. Schade nur, dass man Assoziationen zum Schach knüpft. Dabei ist das doch ein Spiel, bei dem man etwas Brain haben sollte …

                1. hi,

                  BTW - King Lully ist von einem Störer (vermutlich der Gunnar Bittermann-Spammer, dem ich mal kurz geantwortet habe ;) reserviert worden, darum ist der Name länger geworden.

                  Wenn ich Gunnar wäre, wüsste ich, wie ich jetzt reagieren würde.

                  FYI: Vor ein paar Stunden hat hier jemand unter dem Namen "Gunnar Bittermann" tatsächlich ein paar Spam-Postings abgesetzt.

                  Der "richtige" Gunnar schreibt seinen Bittermann mit einem "s" drin.

                  gruß,
                  wahsaga

                  --
                  /voodoo.css:
                  #GeorgeWBush { position:absolute; bottom:-6ft; }
            2. ... ausschliesslich diese belanglose Frage zur Beantwortung herauszupicken?

              Nein, schau dir bitte meinen anderen Post an.