Die MySQL-Gruppe by und max gibt falsche Zeilen zurück

8

Ich habe zwei Tische und versuche den "Beitrag" mit der höchsten Punktzahl pro Tag zu finden.

%Vor%

Ich habe die Abfrage unten versucht. Es gibt die korrekte Punktzahl zurück, aber die anderen Spalten sind nur zufällige Zeilen. Was mache ich falsch?

%Vor%     
user1070125 28.11.2011, 21:20
quelle

5 Antworten

2

Ich stoße ständig auf dieses Problem. Wenn MySQL eine Aggregatfunktion für nicht aggregierte Spalten ausführt, ruft es einfach die ersten Daten ab, die für diese Gruppe ausgeführt werden, unabhängig davon, ob sie aus der MAX-Zeile stammen oder nicht. Sie müssen also die Daten in einer inneren Abfrage so ordnen, dass die Maxes zuerst in ihren Gruppen sind. Sehen Sie, ob dies für Sie funktioniert:

%Vor%

Beachten Sie, dass ich hier keine MAX-Funktion verwende. Die Sortierung nach der absteigenden Punktzahl und die Gruppierung nach Datum in der äußeren Abfrage führen zu der höchsten Punktzahl nach Datum. Beachten Sie auch, dass ich die WHERE-Klausel in die innere Abfrage eingefügt habe. Innere Abfragen wie diese (die manchmal notwendig sind) sind nicht sehr effizient, da sie keine Indizes für die äußere Abfrage enthalten, auf der optimiert werden soll. Stellen Sie also sicher, dass Ihre innere Ergebnismenge so klein wie möglich ist. Beachten Sie schließlich die GROUP BY DATE (t.pubdate_utc). Wenn ich es nicht nur auf die Datumsinformationen reduzieren würde, gäbe es viel mehr als 18 Ergebnisse, da dann auch Zeiten gezählt werden.

Bearbeiten: Wurde in INTERVAL -17 DAY geändert, um statt 19 nun 18 Ergebnisse zu erhalten.

    
Kasey Speakman 01.01.2012 01:58
quelle
0
%Vor%

Wenn Sie diese Daten nach Column1 bestellen, dann sieht das so aus ... orderby sortiert einfach die erste Spalte ....

%Vor%     
m.qayyum 28.11.2011 22:11
quelle
0

ist ein wenig schwierig zu verstehen, was Sie tun möchten.

Die Wörter (Spalten (Beiträge, Kommentare, Favoriten) und PK), habe ich verstanden, dass Sie die Werte erhöhen und nicht jede Stimme aufzeichnen.

Diese Auswahl gibt die Daten aus dem Post und die Punktzahl zurück, indem der größere Punkt auf 18 begrenzt wird.

%Vor%

Wenn Sie die meisten Stimmen des Tages auswählen möchten, müssen Sie die Likes / Favs anders aufzeichnen und benötigen Daten in dieser Tabelle (posts_points).

    
Cristian 29.11.2011 03:13
quelle
0

Wow! Trickreich. Zum Beispiel gibt es immer die Möglichkeit von Bindungen für max.

Die folgende Lösung erstellt eine Zwischenliste der max_scores des Tages und ruft dann alle Beiträge ab, deren Bewertungen dem Maximum für ihren Tag entsprechen. Es gibt Verbindungen zurück, so dass Sie für einen bestimmten Tag zwei Zeilen erhalten können. Ich bitte um Verzeihung, dass ich das nicht testen kann, also gebe Feedback, und ich bin mir sicher, dass wir das tun können, was du brauchst.

%Vor%     
Tom Haws 06.12.2011 05:26
quelle
0

Sie können diese Abfrage sehen .Inner Abfrage ist erstens holen Sie die Zeilen, die gleiche Post-ID in beiden Tabellen als Summe (pp.comments + pp.likes + pp.favorites) als Ergebnis .Outer Query ist fetch max score und doing Gruppe bis zum richtigen Zeitpunkt ....

%Vor%     
Pradeep Sharma 22.12.2011 09:44
quelle