SQL-Trick

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

  • SQL-Trick

    Hallo SQL-Profis,

    ich habe da mal eine Frage.

    Ich habe ein Bildvoting-System, was so funktioniert, dass jedes Voting (1-10 Punkte) in eine Feld geschrieben wir und die ID des Users.
    Wenn ich nun die Punktzahl für einen User anzeige ist das Kein problem, alle Punkte zu dieser ID zusammenzählen und durch die Anzahl an Votes teilen.


    Nun möchte ich aber eine Top 10 Anzeige. Also müssen alle User erst mal berechnet werden, vür jeden User alle Punkte zusammen zählen etc. Das frißt natürlich unheimlich Resourcen bei jedem Aufruf.
    Kann man das evtl. schon innerhalb einer SQL Abfrage handeln? SQL überrascht mich immer mehr, was man da schon alles in die Query packen kann. Da gibts doch sicher auch einen Trick, wie man während dem SELECT schon berechnen kann wie viele Einträge eine ID hat und den Durchschnitt berechnet.
    In meiner Tabelle habe ich folgende Felder:
    user = Der zu bewertende User
    points = die vergebene Punktzahl (1-10)
    owner = der User, der gevotet hat (spiel hier nun aber keine Rolle)

    Wäre für Hilfe sehr dankbar.

    Grüße, Andi

  • #2
    AVG() heißt die Benötigte Aggregat Funktion ...

    z.B.:

    SELECT user, AVG(points)
    FROM voting
    GROUP BY user
    ORDER BY AVG(points) DESC
    LIMIT 10
    carpe noctem

    [color=blue]Bitte keine Fragen per EMail ... im Forum haben alle was davon ... und ich beantworte EMail-Fragen von Foren-Mitgliedern in der Regel eh nicht![/color]
    [color=red]Hinweis: Ich bin weder Mitglied noch Angestellter von ebiz-consult! Alles was ich hier von mir gebe tue ich in eigener Verantwortung![/color]

    Kommentar


    • #3
      goth spricht sql als muttersprache
      (-:
      Bookmarks:·Bilder·Jobs·Recht·
      kostenloser Webkataloge-Assistent

      Kommentar


      • #4
        @kill_bill: Das glaube ich auch

        @goth: Genau das meine ich mit so "Tricks"! Merci

        Kommentar


        • #5
          @kill_bill: Das glaube ich auch

          @goth: Genau das meine ich mit so "Tricks"! Merci
          Achso, was bekomme ich denn dann zurück? Ist dann "points" schon der berechnette Durchschnitt? Wäre anzunehmen. Ich probiers mal.

          Dank & Grüße
          Andi

          Kommentar


          • #6
            Hmmm, jetzt gubts doch Probleme - ich bekomm nichts angezeigt. Also erst mal erhalte eine Fehlermeldung, dass es kein gültiges result ist. Ich habe mal bei AVG im SQL-Buch nachgeschaut und das mal als simples Beispiel so abgeändert:
            Hatte mich auch vertan, "owner" ist der, für den gevotet wurde.

            PHP-Code:
            $res mysql_query("SELECT owner, AVG(points) FROM $db_image_vote GROUP BY owner");

            while(
            $cur mysql_fetch_array($res)){
                print 
            $cur['owner']." = ".$cur['points']."<br>";

            Ich bekomme nun auch eine schöne Liste mit allen User-IDs, aber keine Punkte dazu. Mache ich den GROUP BY wieder rein, kommt die Fehlermeldung.
            Muß points denn eine bestimmtes Tabellenformat haben um berechnet werden zu können. Ist momentan ein TINYINT habe auch scon INT, FLOAT und VARCHAR getestet, jedoch erfolglos. Der Name "points" stimmt aber. Hatte ihn auch geändert, da ich dachte er sei evtl. reserviert. Aber auch das brachte nichts.
            Nun bin ich ratlos

            Grüße, Andi

            Kommentar


            • #7
              Ich habs!!!!

              Das muß so aussehen:

              AVG(points) AS durchschnitt

              So gehts!

              Hilf dir selbst, so hilft dir Goth - oder wie heiß das?

              Kommentar


              • #8
                Vergib' für AVG(points) 'nen Alias:

                SELECT owner, AVG(points) points
                FROM ....

                ... hmmnnn ... zu spät ... das "AS" läßt du besser weg ... ist nicht ANSI-konform ...
                carpe noctem

                [color=blue]Bitte keine Fragen per EMail ... im Forum haben alle was davon ... und ich beantworte EMail-Fragen von Foren-Mitgliedern in der Regel eh nicht![/color]
                [color=red]Hinweis: Ich bin weder Mitglied noch Angestellter von ebiz-consult! Alles was ich hier von mir gebe tue ich in eigener Verantwortung![/color]

                Kommentar


                • #9
                  Gut, AS wech!

                  Jetzt die nächste Hürde: Ich möchte nur User in den Top 10 anzeigen, die mindestens 10 Bewertungen haben. Ich habe da im SQL-Buch was mit MIN und MAX gesehen, ich schlag mal nach - aber vielleicht bist Du ja schneller

                  Grüße

                  Kommentar


                  • #10
                    MIN und MAX liefern Dir die Minimal bzw. Maximal Werte

                    Probier' sowas:
                    Code:
                    SELECT owner, AVG(points) avg_points
                      FROM voting
                     GROUP BY owner
                     ORDER BY AVG(points) DESC
                    HAVING COUNT(*) >= 10
                     LIMIT 10
                    Die Aggregat-Funktion COUNT() liefert die einfach 'ne Anzahl ... HAVING ist für Gruppierte Daten (GROUP BY) sowas wie WHERE ... also die Möglichkeit der Eingrenzung.
                    carpe noctem

                    [color=blue]Bitte keine Fragen per EMail ... im Forum haben alle was davon ... und ich beantworte EMail-Fragen von Foren-Mitgliedern in der Regel eh nicht![/color]
                    [color=red]Hinweis: Ich bin weder Mitglied noch Angestellter von ebiz-consult! Alles was ich hier von mir gebe tue ich in eigener Verantwortung![/color]

                    Kommentar


                    • #11
                      Ja sagenhaft!

                      Ich hatte es nur mit COUNT probiert aber eine Fehlermeldung erhalten. Aber mit HAVING läufts!

                      Damit wäre jetzt alles geklärt.

                      Besten Dank nochmal

                      Kommentar

                      Lädt...
                      X