Announcement

Collapse
No announcement yet.

SUM() über 2 Tabellen möglich ??

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • SUM() über 2 Tabellen möglich ??

    Hallo ihr netten und kompetenten und verständnisvollen Profis hier!

    Ich wieder...

    Hab wieder einen Spezialfall - zumindest für mich...

    Ich habe derzeit folgendes Summen-query bei einer Tabelle...

    Code:
    $sql="SELECT
          Nickname, Punkte, SUM(Punkte) AS UserSumme
          FROM tabtipps
          GROUP BY Nickname
          ORDER BY UserSumme DESC, Nickname ASC";
    Ich hätte jetzt noch eine zweite Tabelle wo ich ebenso summieren würde - tabsonderwetten.Nickname, tabsonderwetten.Punkte

    Bekomm ich es irgendwie hin, in einer Abfrage beide auf einmal zu einer Geasmtsumme zu bekommen?

    Danke!!
    Juergen

  • #2
    INNER Join und die Punkte einfach addieren.

    BTW. Zwei Tabellen hört sich nicht nach einem guten Konzept an.
    Bei SQL-Code bitte beachten: Formatierung von SQL in Beiträgen

    Comment


    • #3
      Alles klar, das versuch ich dann zu Hause gleich mal.. den User als gemeinsames Kriterium hab ich ja.

      Danke!

      Comment


      • #4
        Hallo hausl78,
        Originally posted by hausl78 View Post
        ...Ich habe derzeit folgendes Summen-query bei einer Tabelle...

        Code:
        $sql="SELECT
              Nickname, Punkte, SUM(Punkte) AS UserSumme
              FROM tabtipps
              GROUP BY Nickname
              ORDER BY UserSumme DESC, Nickname ASC";
        ich will dir nicht zu nahe treten, aber diese Abfrage ist sowohl syntaktischer als auch logischer Unsinn! Eine Spalte gleichzeitig als Wert und als Aggregat zu listen macht überhaupt keinen Sinn. Welchen Wert erwartest du da?
        Alle nichtaggregierten bzw. nicht funktionell abhängigen Spalten aus dem Select-Teil MÜSSEN auch im GROUP BY aufgeführt werden. Da die Spalte Punkte offensichtlich nicht funktionell von Nickname abhängt (sonst würdest du darüber keine Summe bilden), muss Punkte auch im GROUP BY aufgeführt werden - womit dann die SUMmen-Funktion keinen Sinn mehr macht - bzw. aus dem Select-Teil entfernt werden - was das Logischere wäre.

        Gruß Falk
        Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

        Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

        Comment


        • #5
          Hallo Falk!

          Ich glaub dir das sofort, aber es liefert das gewünschte Ergbnis, daher hab ich mir keinen Kopf mehr darüber gemacht..

          Ich habe vereinfacht folgendes

          Code:
          Stefan  2
          Franz   2
          Robert  3
          Stefan  1
          Stefan  2
          Robert  3
          Franz   2
          ...
          Und möchte als Ergebnis

          Code:
          Robert 6
          Stefan 5
          Franz  4
          juergen

          Comment


          • #6
            Originally posted by hausl78 View Post
            ...aber es liefert das gewünschte Ergbnis, daher hab ich mir keinen Kopf mehr darüber gemacht..
            Das heißt nicht immer zwangsläufig das es auch richtig ist .
            MySQL hat eine "sehr laxe" (um nicht zu sagen fehlerhafte) Auffassung von funktionaler Abhängigkeit und überläßt in der Standardeinstellung dem Anwender die Entscheidung. (In jedem anderen DBMS würde dein Statement einfach nur einen Fehler produzieren) Deshalb sind Ergebnisse solcher Abfragen immer mit Vorsicht zu geniesen, da sie mehr oder weniger Zufällig und nicht interpretierbar sind.
            Für deine Daten und das gewünschte Ergebnis wäre das hier absolut ausreichend (und korrekt):
            [highlight=sql]
            SELECT
            Nickname, SUM(Punkte) AS UserSumme
            FROM tabtipps
            GROUP BY Nickname
            ORDER BY UserSumme DESC, Nickname ASC
            [/highlight]

            Gruß Falk
            Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

            Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

            Comment


            • #7
              Ah, ok, also

              Code:
              statt: SELECT  Nickname, Punkte, SUM(Punkte) AS UserSumme ...
              das:   SELECT  Nickname, SUM(Punkte) AS UserSumme ...
              ok, danke dann werd ich das so übernehmen..

              juergen

              Comment


              • #8
                Jetzt bin ich noch auf was ganz Blödes draufgekommen..

                Ich habe in meiner Abfrage
                Code:
                SELECT  Nickname, SUM(Punkte)
                AS UserSumme
                FROM tabtipps
                GROUP BY Nickname
                ORDER BY UserSumme DESC, Nickname ASC
                ja nur die getippten Spiele drinnen. Wenn jetzt ein User gar keinen Tipp abgibt, dann sollte der aber auch mit 0 Punkten im Ranking kommen. Wie kann ich das schaffen?

                ich habe

                tabuser -> user mit eindeutigen nickname
                tabtipps -> tipps mit punkte und eindeutigen nickname
                tabzw -> zusatzwwetten mit punkten und eindeutigen nicknamen

                Ich brauch nun ein gesamtranking mit aufsummieren tabtipps.punkte und tabzw.puntke und dann sollen die user mit 0 punkten auch noch drinnen sein (ist das ein LEFT JOIN auf tabuser?)

                Ich glaub das bekomm ich nicht hin.. Geht das überhaupt? Weil sonst mach ich zuerst die Summierung der beiden Tabellen und frag dann noch irgnedwie ab ob ein User 0 hat und zeit den extra an oder so

                Comment


                • #9
                  (ist das ein LEFT JOIN auf tabuser?)
                  Geht das überhaupt?
                  Ja

                  Ich glaub das bekomm ich nicht hin..
                  Warum aufgeben?
                  Hinsetzen und ausarbeiten ist angesagt, bau dein Statement Stück für Stück zusammen.
                  Bei SQL-Code bitte beachten: Formatierung von SQL in Beiträgen

                  Comment


                  • #10
                    Ok, wennst möglich ist, dann los...

                    Ich hab mal das hier

                    Code:
                    SELECT *, (t.Punkte+z.Punkte) AS GesamtSumme
                    FROM tabuser u
                    LEFT JOIN tabtipps t
                      ON u.Nickname = t.Nickname
                    LEFT JOIN tabzwtipps z
                      ON u.Nickname = z.Nickname
                    GROUP BY u.Nickname
                    Ich bekommen nun für jeden User einen Satz, das wär ja schon mal korrekt, aber die Gesamtpunkte die da rauskommen sind Mist..

                    Bitte um einen Tipp, dann mach ich weiter ;-)

                    // EDIT: Ich seh gerade die Spalte Punkte hab ich fast überall mit NULL und ev. ist das das Problem, weil NULL + 2 halt nichts bringt..
                    Ich muss das umstellen, das die Punktespalte 0 per default ist und nicht NULL ev. ghets dann..

                    juergen
                    Zuletzt editiert von hausl78; 24.08.2010, 15:41.

                    Comment


                    • #11
                      Schau Dir aml die ifNULL() Funktion an die sollte sowas eigentlich können. Also NULL in einen int 0 umzuwandeln.

                      Hier zum Beispiel

                      Comment


                      • #12
                        Originally posted by hausl78 View Post
                        ...Ich seh gerade die Spalte Punkte hab ich fast überall mit NULL und ev. ist das das Problem, weil NULL + 2 halt nichts bringt..
                        Ich muss das umstellen, das die Punktespalte 0 per default ist und nicht NULL ev. ghets dann..
                        Genau das ist das Problem! Aber default auf 0 ändern bringt nichts, da die NULLS aus dem LEFT JOIN stammen (ein user kann ja durchaus tabtipps aber keine tabzwtipps haben).
                        Die Verwendung von IFNULL(), wie von fanderlf vorgeschlagen, ist da besser.

                        Gruß Falk
                        Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                        Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                        Comment


                        • #13
                          Hallo nochmals,

                          ich bekomm es irgendwie nicht hin, mit der Doku von ifnull das bei meinem derzeitigen sql einzubauen, wo/wie gehört das genau hin, kann mir da jemand nen Denkansatz oder so geben.. gehört der gesamte LEFT JOIN da rein, oder oben die t.Punkte und z.Punkte?

                          Bzw. muss ich der Funktion ja irgendwie sagen wenn NULL dann 0 sonst den Wert lt. DB also t.Punkte.

                          Code:
                          SELECT u.Nickname, SUM(t.Punkte+z.Punkte) AS UserSumme
                          FROM tabuser u
                          LEFT JOIN tabtipps t
                            ON u.Nickname = t.Nickname
                          LEFT JOIN tabzwtipps z
                            ON u.Nickname = z.Nickname
                          GROUP BY u.Nickname
                          Zuletzt editiert von hausl78; 24.08.2010, 20:32.

                          Comment


                          • #14
                            Ich hab eben eine Variante noch gefunden, die liefert mir - bis auf den ersten korrekte Werte

                            Code:
                            SELECT u.Nickname, SUM( coalesce(t.Punkte, 0) + coalesce(z.Punkte,0) ) AS UserSumme
                            FROM tabuser u
                            LEFT JOIN tabtipps t
                              ON u.Nickname = t.Nickname
                            LEFT JOIN tabzwtipps z
                              ON u.Nickname = z.Nickname
                            GROUP BY u.Nickname
                            ORDER BY UserSumme DESC, Nickname ASC
                            Bringt dann raus:

                            Code:
                            Nickname  UserSumme
                            Hiasi        178
                            Franzi        13
                            Hans           8
                            Karli          7
                            Seppi          5
                            admin          0
                            Der erste Wert müsste eigentlich 30 sein, die anderen stimmen...
                            Geht es so auch irgendwie oder doch ifnull ??

                            Juergen


                            // EDIT ----------

                            Die Abfrage mit IFNULL ergibt das selbe Ergebnis wie oben.... !!!!???

                            SELECT u.Nickname, sum( IFNULL(t.Punkte, 0) + IFNULL(z.Punkte, 0) ) AS UserSumme
                            FROM tabuser u
                            LEFT JOIN tabtipps t
                            ON u.Nickname = t.Nickname
                            LEFT JOIN tabzwtipps z
                            ON u.Nickname = z.Nickname
                            GROUP BY u.Nickname
                            ORDER BY UserSumme DESC, Nickname ASC
                            Zuletzt editiert von hausl78; 24.08.2010, 20:51.

                            Comment


                            • #15
                              Ich hab das nur eben auf Google gesucht Keine Ahnung ob das wirklich die richtige Funktion dafür war. Vielleicht ist ja eine davon schon deprecated.

                              Comment

                              Working...
                              X