gottlieb: Select Sum nur bei Maximalgebot

Hallöle,
was ist eigentlich an dieser Query falsch?

SELECT SUM(A.gebot) FROM Verkaufsgebote  AS A WHERE A.bieterID=123 AND A.gebot=(SELECT MAX(B.gebot) FROM Verkaufsgebote AS B );

id  verkaufid  userid  gebot
2  2    3   2
3  2    123  1
5  2    883  4
4  3    883  2
6  3    123  3
7  4    123  6

Er soll die Summe der Gebote des Users "123" holen, aber nur da, für welche verkaufid er auch der Höchstbieter ist? Ich muss der Query nur noch verklickern, dass er immer den Höchstgebot pro verkaufid holt.

  1. shit,
    DBMS mySQL > 5.0.x

  2. Hello,

    Er soll die Summe der Gebote des Users "123" holen, aber nur da, für welche verkaufid er auch der Höchstbieter ist? Ich muss der Query nur noch verklickern, dass er immer den Höchstgebot pro verkaufid holt.

    dann mach das doch:
    ... AND A.gebot=(SELECT MAX(B.gebot) FROM Verkaufsgebote AS b WHERE b.userid = A.userid)

    (ungetestet, gerade keine DB zur Hand)

    MfG
    Rouven

    --
    -------------------
    sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
    Vegetarier essen meinem Essen das Essen weg.
    1. Hi,

      dann mach das doch:
      ... AND A.gebot=(SELECT MAX(B.gebot) FROM Verkaufsgebote AS b WHERE b.userid = A.userid)

      Hatte ich auch versucht, deshalb weiß ich gerade nicht weiter.

      SELECT SUM(A.gebot) FROM Verkaufsgebote  AS A WHERE A.bieterID=123 AND A.gebot=(SELECT MAX(B.gebot) FROM Verkaufsgebote AS B WHERE A.bieterID=B.bieterID);

      id  verkaufid  bieterID  gebot
      2  2    3   2
      3  2    123  1
      5  2    883  4
      4  3    883  2
      6  3    123  3
      7  4    123  6

      Es kommt 6 raus. Es müsste aber 7 herauskommen, da ich bei verkaufid 4 und 3 der Höchstbieter bin.

      1. Hello,

        Es kommt 6 raus. Es müsste aber 7 herauskommen, da ich bei verkaufid 4 und 3 der Höchstbieter bin.

        das hast du der Datenbank aber so nicht gesagt, sorry, hab mich gerade nicht hinreichend mit deiner Problemstellung auseinandergesetzt. Mein Tag war lang, vielleicht ist es doch ganz einfach, aber ich glaube du hast was aufwändigeres vor dir. Im Moment suchst du alle Sätze mit deiner ID und dem höchsten Gebot (deiner ID). Dein höchstes Gebot ist 6, du hast nur bei einer Auktion ein Gebot von 6 abgegeben, da ist keine Verbindung zu dem anderen Gebot. Daher die "falsche" Summe.
        Ich hab gerade überlegt, ob ich einen Alternativvorschlag hab, aber auf die Schnelle kommt mir nichts, sorry.

        MfG
        Rouven

        --
        -------------------
        sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
        There's no such thing as a free lunch  --  Milton Friedman
        1. Hi zusammen,

          Mein Tag war lang, vielleicht ist es doch ganz einfach,

          Naja, eBay kann man nicht an einem Tag nachprogrammieren ;)

          Imho braucht er eine Query, welche ihm für jedes Angebot das maximale Gebot zurückgibt. Diese Query kann er in einem LEFT OUTER JOIN verwenden (muss ja nicht immer ein Gebot geben) und mittels AngebotId und dem Max-Wert aus der Unterabfrage verbinden. Es kann ja nur einen Max-Wert pro Angebot geben (sonst würde eBay auch nicht funzen). Die Anzahl der Gebote macht er dann einfach über eine korrelierte Unterabfrage, die genau einen Wert, nämlich COUNT(*) zurückgibt. In diese brauch er nur von aussen die ID des Angebotes reingeben.

          Mit etwas mehr Normalisierung im Datenmodell sollte es deutschlicher sichtbar sein.

          aber auf die Schnelle kommt mir nichts

          Aber dagegen gibt es doch Mittelchen vom Onkel Doktor.

          Es kommt 6 raus. Es müsste aber 7 herauskommen, da ich bei verkaufid 4 und 3 der Höchstbieter bin.

          Weil 4 + 3 = 7 ist?

          Ciao, Frank

          1. Tach,

            Naja, eBay kann man nicht an einem Tag nachprogrammieren ;)

            :-))

            Imho braucht er eine Query, welche ihm für jedes Angebot das maximale Gebot zurückgibt. Diese Query kann er in einem LEFT OUTER JOIN verwenden (muss ja nicht immer ein Gebot geben) und mittels AngebotId und dem Max-Wert aus der Unterabfrage verbinden. Es kann ja nur einen Max-Wert pro Angebot geben (sonst würde eBay auch nicht funzen). Die Anzahl der Gebote macht er dann einfach über eine korrelierte Unterabfrage, die genau einen Wert, nämlich COUNT(*) zurückgibt. In diese brauch er nur von aussen die ID des Angebotes reingeben.

            Das hört sich jetzt gerade einwenig kompliziert an. Ich versuche das mal zu verstehen und umzusetzen.

            Mit etwas mehr Normalisierung im Datenmodell sollte es deutschlicher sichtbar sein.

            Wie könnte man das noch mehr normalisieren?

            Es kommt 6 raus. Es müsste aber 7 herauskommen, da ich bei verkaufid 4 und 3 der Höchstbieter bin.

            Weil 4 + 3 = 7 ist?

            id  verkaufid  bieterID  gebot
            2     2         3        2
            3     2        123       1     <<<< Kein Höchstbieter
            5     2        883       4
            4     3        883       2
            6     3        123       3      <<<< Hier bin ich Höchstbieter mit 3 Euro
            7     4        123       6      <<<< Hier bin ich Höchstbieter mit 6 Euro

            Sorry, das müsste dann 6+3 heißen :-)))

            1. Hi,

              also fangen wir mal einfach an:

              1. Schreib ein Select welches für jedes Angebot das momentane Höchstgebot zurückgibt. verkaufid sollte da auch mit drin sein ;)

              2. Schreib ein Select welches die die Anzahl der Gebote für jedes Angebot (i.e. verkaufid) zurückgibt

              3. Schreib ein Select auf die Gebote Tabelle und korreliere (joine) mit dem Select aus 1) anhand von verkaufid und gebot und ebenfalls mit dem Select aus 2) anhand von verkaufid

              Wie könnte man das noch mehr normalisieren?

              Hat sich mit deinem Beispiel für die Tabelle erübrigt, war nich so schnell im Mitlesen.

              Sorry, das müsste dann 6+3 heißen :-)))

              Was willst du eigentlich mit diesem Wert, "gib mir die gesamtsumme von allen Geboten von Bietern die irgendwo ein Maximalgebot abgegeben haben"?

              Dann sag das auch so der Datenbank. :)   Ein Schritt näher zur Lösung ist ein Select, welches dir für jedes Angebot (verkaufid) den Höchstbieter zurückgibt.

              Gut nacht, Frank

              1. Nabend,

                also fangen wir mal einfach an:

                genau richtig :-))

                1. Schreib ein Select welches für jedes Angebot das momentane Höchstgebot zurückgibt. verkaufid sollte da auch mit drin sein ;)

                2. Schreib ein Select welches die die Anzahl der Gebote für jedes Angebot (i.e. verkaufid) zurückgibt

                3. Schreib ein Select auf die Gebote Tabelle und korreliere (joine) mit dem Select aus 1) anhand von verkaufid und gebot und ebenfalls mit dem Select aus 2) anhand von verkaufid

                Bin gerade total müde, das mache ich gleich morgen und gebe ein Feedbach dazu ab.

                Sorry, das müsste dann 6+3 heißen :-)))

                Was willst du eigentlich mit diesem Wert, "gib mir die gesamtsumme von allen Geboten von Bietern die irgendwo ein Maximalgebot abgegeben haben"?

                Wenn ein Mitglied ein Gebot abgibt, wird erst überprüft, was die gerade das Höchstgebot ist. Anschließend wird überprüft, ob ich mir das Produkt leisten kann. D.h.
                Man hat ein Konto (Nehmen wir an Spalte/Feld: Geld). Diesmal wird überprüft, ob ich genug Guthaben habe um mitzubieten. Deshalb muss ich überprüfen, wo ich gerade der Höchstbietender bin, da dies wahrscheinlich vom Guthaben später abgezogen wird.

                Wenn ich auf meinem Konto nun 10 habe, und in zwei Auktionen der Höchstbietender mit 6 und 3, dann kann ich nicht in einer neuen Auktion noch mit 2 bieten. Im Falle, dass am Ende der Auktion ich der Gewinner bin, wäre nicht so gut, da ich dann im Minus / Soll wäre :-)

                Dann sag das auch so der Datenbank. :)   Ein Schritt näher zur Lösung ist ein Select, welches dir für jedes Angebot (verkaufid) den Höchstbieter zurückgibt.

                Aha. Ok. Ich selektiere alle Höchstbieter und überprüfe in JSP, ob ich irgendwie enthalten bin. Auch ne Idee :-)

                (Ich habe auch mal gelesen gehabt, dass man JSP weniger zum Coden, sondern zum Designen (Ausgabe) verwenden soll, und die Java-Klassen für Funktionen und Codes) Ich weiß, total blöd beschrieben jetzt ;) Ich gehe mal ins Bett, vielen Dank vorerst und Gute Nacht

        2. Nabend,

          Im Moment suchst du alle Sätze mit deiner ID und dem höchsten Gebot (deiner ID).

          Genau. Ich habe einmal 6 abgegeben, wo ich zurzeit der Höchstbieter bin und einmal die 1 wo ich der Höchstbieter bin. Einmal habe ich zwar noch 2 als Gebot abgegeben, dort bin ich aber nicht der Höchstbieter.

          Ich hab gerade überlegt, ob ich einen Alternativvorschlag hab, aber auf die Schnelle kommt mir nichts, sorry.

          Brauchst dich doch nicht entschuldigen, finde es lieb, wie viele Menschen hier anderen und mir unter die Arme greifen. Bei meinem Problem, habe ich gedacht, dass es eventuell eine Kleinigkeit ist.

  3. yo,

    Er soll die Summe der Gebote des Users "123" holen, aber nur da, für welche verkaufid er auch der Höchstbieter ist? Ich muss der Query nur noch verklickern, dass er immer den Höchstgebot pro verkaufid holt.

    kleiner tipp am anfang, ich würde das AS beim aliasnamen weglassen. Ausserdem muss die korrelation über die verkaufsid gehen und nicht über die bieterid.

    SELECT SUM(A.gebot)
    FROM Verkaufsgebote A
    WHERE A.bieterID=123
    AND a.gebot (SELECT MAX(b.gebot)
                 FROM Verkaufsgebote B
                 WHERE A.Verkaufsid = B.verkaufsid
               )
    ;

    Ilja

    1. hi,

      kleiner tipp am anfang, ich würde das AS beim aliasnamen weglassen. Ausserdem muss die korrelation über die verkaufsid gehen und nicht über die bieterid.

      Ja, ich gewöhne es mir ab. Dauert nur bissl :-)

      SELECT SUM(A.gebot)
      FROM Verkaufsgebote A
      WHERE A.bieterID=123
      AND a.gebot (SELECT MAX(b.gebot)
                   FROM Verkaufsgebote B
                   WHERE A.Verkaufsid = B.verkaufsid
                 )
      ;

      Tatsächlich, diese Query klappt. Obwohl ich dachte, dass ich diese Variante auch probiert hatte. Dann brauch ich den Vorschlag von Frank dann nicht mehr umsetzen? Heute Abend versuche ich es aber, wenn ich dazu komme, würde mich schon interessieren, ob es klappt :-)
      Feedback kommt dann lieber Frank :-)

      Grüße