Gruppierte Daten mit aktuellsten Datum anzeigen

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

  • Gruppierte Daten mit aktuellsten Datum anzeigen

    Hi,

    de abfrage unten gibt mir alle Produkte geordnet nach dem Durchschnitt aus.
    Es gibt zu jedem Produkt mehrere Bewertungen, die ebenfalls mit Datum in der Datenbank stehen. Nun möchte ich neben der Gruppierung jeweils die aktuellste Bewertung zu jedem Datensatz mit ausgeben. Durch die Gruppierung erhalte ich immer das letzte Datum, auch wenn ich bei ORDER BY votedate DESC angebe

    Kann ich in der Abfrage neben dem Durchschnitt und der Anzahll an Bewertungen auch noch das aktuellste Datum ausgeben (also die letzte Bewertung) oder benötige ich dazu eine zweite Abfrage?

    Code:
    SELECT count( *  ) AS anzahl, pd.produktname, o.votedate, avg( rank ) AS durchschnitt
    FROM opinions o, produktdetails pd
    WHERE pd.id = o.id
    GROUP BY pd.id
    HAVING anzahl >3
    ORDER BY durchschnitt DESC , anzahl DESC
    LIMIT 0 , 50
    Zuletzt geändert von lx-club; 27.01.2010, 12:50.

  • #2
    Hallo,

    wenn ich dich richtig verstanden habe (ansonsten bitte genauer erklären), suchst du sowas: MySQL :: MySQL 5.0 Reference Manual :: 3.6.4 The Rows Holding the Group-wise Maximum of a Certain Column

    Ich empfehle die letzte Variante mit dem negativen Left Join, weil die effizienter ist.

    Gruß,

    Amica
    [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
    Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
    Super, danke!
    [/COLOR]

    Kommentar


    • #3
      Hi,

      ja ich glaube das is die richtige Richtung.

      nochmal etwas genauer:

      ohne Gruppierung:

      produkt | votedate | opinion | rank
      -----------------------------------
      a------2009-12-09--gut------3
      a------2010-01-05--geht so--1

      nach dem gruppieren:
      produkt | votedate | opinion | avg | anzahl
      ------------------------------------------
      a------2009-12-09--gut------2.000 --2

      nur das jetzt nich die meinung von 2009 sondern 2010 stehen soll

      Kommentar


      • #4
        Wie lautet dein aktueller Code?
        [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
        Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
        Super, danke!
        [/COLOR]

        Kommentar


        • #5
          nach dem Link von oben klappt es bei mir mit folgender Abfrage:

          Code:
          SELECT o.votedate,o.opinion,o.produktname,o2.anz,o2.avg
          FROM opinions o
          INNER JOIN produktdetails pd
          ON pd.id = o.pid 
          INNER JOIN(
              SELECT count(*) as anz,avg(rank)as avg, max(votedate) as maxvdate,produktname 
              FROM opinions GROUP BY pid
          ) as o2
          ON o2.pid =  o.pid AND o2.maxvdate=o.votedate
          WHERE pd.produktart = 'tools'
          ORDER BY anz DESC
          Zuletzt geändert von lx-club; 27.01.2010, 14:46.

          Kommentar


          • #6
            Wenn du nicht viele Datensätze hast, mag das gehen, aber bei Massendaten könnte MySQL bei dieser korrelierten Unterabfrage schon in die Knie gehen. Mach es lieber mit dem negativen Left Join wie im letzten Beispiel auf der Seite.

            Edit: Sorry, du hast ja eine unkorrelierte Unterabfrage genommen. Das könnte gehen.
            [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
            Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
            Super, danke!
            [/COLOR]

            Kommentar


            • #7
              Hi,

              ja ich habe das Beispiel mit dem Join genommen.
              Ich begrenze die Liste ach immer auf 100 Datensätze und die Ausführungszeit liegt bei 0,04 sek, das is ja in Ordnung.

              Aber danke für den Link, der hat mir echt weitergeholfen :-)

              Kommentar

              Lädt...
              X