Gruppieren und Aggregieren ...

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

  • Gruppieren und Aggregieren ...

    Hi !

    Ich habe zwei Tabellen. In einer speichere ich meine Nutzer (login) in der anderen die Bewertung derer Bilder (votingpics). Ein Nutzer kann N Votingpics haben.

    Nun möchte ich in einer Top10 ausgeben, welche Bilder am BNesten bewertet werden - aber von jedem Nutzer nur das 'Beste Bild - Wenn Bild 1 von User 1 also mit 80 % bewertet wird und Bild 2 von diesem User mit 78 %, wird nur Bild 1 in den Top10 erscheinen.

    die Tabelle votingpics enthält folgende relevante einträge :

    id (PK)
    user_id (FK)
    votes (wie oft wurde das Bild gevotet)
    punkte (wie oft davon dafür)

    Nun gibt mir folgendes statement die 10 bestbewerteten Bilder aus:

    Code:
    SELECT v.punkte*100/v.votes AS bewertung
    FROM votingpics v
    GROUP BY v.id
    ORDER BY bewertung DESC
    Da habe ich dann allerdings Nutzer doppelt drin, weil ich nicht nach der user_id gruppiere, das Ergebnis ist aber nach den Bestbewerteten Bildern sortiert.

    wenn ich nach der user_id gruppiere:
    Code:
    SELECT v.punkte*100/v.votes AS bewertung
    FROM votingpics v
    GROUP BY v.user_id
    ORDER BY bewertung DESC
    bekomme ich zwar nur ein Bild eines jeden Nutzers angezeigt - dafür aber nicht das Beste Bild des Nutzers, sondern das mit der niedrigsten id, obwohl ich nach bewertung sortiere.

    Wenn ich nun aggregiere - z.B. :
    Code:
    SELECT MAX(v.punkte*100/v.votes) ...
    bringt das überhaupt nichts - ich nehme an wegen des Dreisatzes ...

    Ich steh echt aufm Schlauch ... Könnt ihr weiterhelfgen ?
    Yeah !

  • #2
    vielleicht hilft dir SELECT DISTINCT weiter...


    An mich bitte keine unaufgeforderten E-Mails senden (ausser ihr seid bereit geld zu zahlen, dann gerne )

    Kommentar


    • #3
      vielleicht hilft dir SELECT DISTINCT weiter...
      Alle Versuche mit Distinct haben bisher exakt das Gleiche Ergebnis wie GROUP BY erbracht.
      Ich muß allerdings ehrlich zugeben, daß ich DISTINCT ungerne und selten gebrauche, ich das also sicherlich falsch gemacht habe, weswegen ich Dir für einen entsprechenden Codeschnipsel voll dankbar wäre *g*
      Yeah !

      Kommentar


      • #4
        ne codeseitige Lösung wär wohl angebracht ausser Du kannst subeselects benutzen...
        Beantworte nie Threads mit mehr als 15 followups...
        Real programmers confuse Halloween and Christmas because OCT 31 = DEC 25

        Kommentar


        • #5
          1. Was zum Teufel sind Subselects ?? *g*

          2. Bisher läuft das Codeseitig - ich wollte aber bewußt auf SQL-seitig umstellen, weil das wesentlich ressourcenschonender ist.
          Yeah !

          Kommentar


          • #6
            Dann solltest Du 'ne MySQL 4.1.x installieren ...
            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


            • #7
              Re: Gruppieren und Aggregieren ...

              Original geschrieben von DaGuertliz

              SELECT v.punkte*100/v.votes AS bewertung
              FROM votingpics v
              GROUP BY v.id
              ORDER BY bewertung DESC

              Da habe ich dann allerdings Nutzer doppelt drin, weil ich nicht nach der user_id gruppiere, das Ergebnis ist aber nach den Bestbewerteten Bildern sortiert.
              Hallo DaGuertliz
              Klar, alle Spalten ohne Aggregatfunktion, die im Select und nicht im GROUP erscheinen machen chaos.

              SELECT id,avg(v.punkte*100/v.votes) AS bewertung
              FROM votingpics v
              GROUP BY v.id
              ORDER BY bewertung DESC

              Kommentar

              Lädt...
              X