Ankündigung

Einklappen
Keine Ankündigung bisher.

Problem mit sum() / JOIN / IFNULL - mehr tabellen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Problem mit sum() / JOIN / IFNULL - mehr tabellen

    Hallo!

    Ich komm gleich zur Sache.. ich habe (die relevanten) Tabellen...

    tabuser:
    - nickname

    tabtipps:
    - nickname
    - punkte

    tabzwtipps:
    - nickname
    - punkte

    Der nickname ist in diesem Fall die ID, puntke ist TINYINT... Jeder User kann in jeder tabelle mehr Tipps haben - muss aber nicht (= NULL möglich!)

    Ich brauche nun ein Gesamtranking über beide Tabellen aufsummiert nach User...

    Ich bin schon soweit das es eigenltich funktioniert - siehe unten - aber der erst Wert leider nicht.. der muss lt. DB 30 sein!!

    Wenn ich statt IFNULL das coalesce nehme kommt das gleiche raus..

    PHP-Code:
    SELECT u.NicknamesumIFNULL(t.Punkte0) + IFNULL(z.Punkte0) ) 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 
    Das kommt derzeit raus - wie gesagt der erste muss 30 sein - die anderen stimmen!

    Code:
    Nickname  UserSumme
    Hiasi        178
    Franzi        13
    Hans           8
    Karli          7
    Seppi          5
    admin          0
    Wo ist der Hund begraben.. ??

    Danke für jeden Tipp - falls wer den SQL create-dump braucht kann ich den gerne hier einstellen..

    Juergen
    Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
    PHP.de Wissenssammlung | Kein Support per PN


  • #2
    Zitat von hausl Beitrag anzeigen
    PHP-Code:
    FROM tabuser u 
    Jeder Benutzer bekommt einen Datensatz im Zwischenergebnis

    Zitat von hausl Beitrag anzeigen
    PHP-Code:
    LEFT JOIN tabtipps t
      ON u
    .Nickname t.Nickname 
    Aus dem einen Datensatz pro User werden jetzt so viele Datensätze, wie der User tabtipps hat. Wenn jeder User 3 tabtipps hat, dann hast du jetzt drei mal so viele Datensätze im Zwischenergebnis.

    Zitat von hausl Beitrag anzeigen
    PHP-Code:
    LEFT JOIN tabzwtipps z
      ON u
    .Nickname z.Nickname 
    Zu jedem Zwischenergbnis wird jetzt geschaut, ob der im Zwischenergebnis erwähnte User auch tabzwtipps hat. Wenn jeder User 4 tabzwtipps hat, und jeder User 3 mal im vorherigen Zwischenergebnis auftaucht, dann taucht jeder User nach diesem JOIN (jeder mit jedem) 12 mal im neuen Zwischenergbnis auf.

    Zitat von hausl Beitrag anzeigen
    PHP-Code:
    GROUP BY u.Nickname 
    Jetzt erst wird anhand des Users gruppiert. In das Endergbnis fließen also 3 * 4 = 12 Datensätze pro User ein, obwohl du eigentlich 3 + 4 = 7 haben willst.
    Meinungen, die ich geäußert habe, sind nicht notwendigerweise meine eigenen. Abweichungen von der deutschen Rechtschreibung unterliegen dem Urheberrecht, dürfen aber unter den Bedingungen von verwendet werden

    Kommentar


    • #3
      Und wie mache ich es richtig ??
      Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
      PHP.de Wissenssammlung | Kein Support per PN

      Kommentar


      • #4
        Ohne Gewähr:
        Code:
        SELECT
          u.Nickname,
          (SELECT SUM(Punkte) FROM tabtipps AS t WHERE t.Nickname = u.Nickname) + 
          (SELECT SUM(Punkte) FROM tabzwtipps AS tz WHERE tz.Nickname = u.Nickname) AS total
        FROM tabuser AS u
        ORDER BY total DESC, Nickname ASC
        Sieht auf den ersten Blick wie ein Performance-Albtraum aus, aber vieleicht ist dein DBMS ja intelligent genug, nicht für jeden User zwei Unterabfragen rauszuhauen.
        Meinungen, die ich geäußert habe, sind nicht notwendigerweise meine eigenen. Abweichungen von der deutschen Rechtschreibung unterliegen dem Urheberrecht, dürfen aber unter den Bedingungen von verwendet werden

        Kommentar


        • #5
          Ähm.. aktuelles MySQL .. ach das wird schon gehen.. alternative wäre 2 Abfragen in ein array rein und sortieren (PHP) geht auch nicht fixer..

          Dein Statement läuft.... und bringt...

          Code:
          "Nickname";"total"
          "Hiasi";"31"
          "Hans";"13"
          "Karli";"7"
          "Seppi";"5"
          "admin";NULL
          "Franzi";NULL

          Muss schauen.. weil mein bisheriges bringt...

          Code:
          "Nickname";"UserSumme"
          "Hiasi";"180"
          "Karli";"21"
          "Seppi";"15"
          "Franzi";"13"
          "Hans";"13"
          "admin";"0"
          juergen
          Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
          PHP.de Wissenssammlung | Kein Support per PN

          Kommentar


          • #6
            Nachtrag..

            Muss mir deins noch ansehen..stimmt nicht ganz.. bei tabzwtipps ist derzeit nur einmal punkte (2 Pkt.) für hiasi drinnen, der rest ist...

            Code:
            $sql="SELECT Nickname, SUM(Punkte) AS UserSumme
                  FROM tabtipps
                  GROUP BY Nickname
                  ORDER BY UserSumme DESC, Nickname ASC";
            
            
            ergibt:
            
            Hiasi 29 
            Franzi 13 
            Hans 13 
            Karli 7 
            Seppi 5
            Muss morgen nochmals schaun...
            Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
            PHP.de Wissenssammlung | Kein Support per PN

            Kommentar


            • #7
              Ist erledigt, ich hab es nun soweit das es scheint zu laufen:

              Code:
              SELECT u.Nickname, IFNULL(t.Punkte, 0) + IFNULL(z.Punkte, 0) UserSumme
              FROM tabuser u
              LEFT JOIN (
              	SELECT Nickname, SUM(Punkte) Punkte
              	FROM tabtipps
              	GROUP BY Nickname
              ) t
                ON u.Nickname = t.Nickname
              LEFT JOIN (
              	SELECT Nickname, SUM(Punkte) Punkte
              	FROM tabzwtipps
              	GROUP BY Nickname
              ) z
                ON u.Nickname = z.Nickname
              GROUP BY u.Nickname
              ORDER BY UserSumme DESC, Nickname ASC
              Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
              PHP.de Wissenssammlung | Kein Support per PN

              Kommentar

              Lädt...
              X