sql >> Database teknologi >  >> RDS >> Mysql

MySQL group by and max returnerer forkerte rækker

Jeg løber ind i dette problem hele tiden. Når MySQL kører en aggregeret funktion, for alle ikke-aggregerede kolonner, trækker den simpelthen de første data, den løber over for den gruppe, uanset om det er fra MAX-rækken eller ej. Så det, du skal gøre, er at bestille dataene i en indre forespørgsel, således at maksimumerne er først i deres grupper. Se om dette virker for dig:

SELECT t.post_id,
       t.profile_id,
       t.score,
       t.pubdate_utc
FROM (SELECT p.profile_id,
             p.post_id,
             p.pubdate_utc,
             (pp.comments + pp.likes + pp.favorites) score
      FROM posts p
      JOIN posts_points pp ON p.post_id = pp.post_id
      WHERE p.pubdate_utc >= DATE_ADD(DATE(NOW()), INTERVAL -17 DAY)
      ORDER BY score DESC
     ) t
GROUP BY DATE(t.pubdate_utc) DESC
;

Bemærk, at jeg ikke bruger nogen MAX-funktion her. Sortering efter faldende score og derefter gruppering efter dato i den ydre forespørgsel vil trække den højeste score efter dato. Bemærk også, at jeg sætter WHERE-sætningen i den indre forespørgsel. Indre forespørgsler som denne (som nogle gange er nødvendige) er ikke særlig effektive, da de ikke har nogen indekser for den ydre forespørgsel at optimere på, så sørg for, at dit indre resultatsæt er så lille, som det kan være. Læg endelig mærke til GRUPPER EFTER DATO(t.pubdate_utc). Hvis jeg ikke reducerede det til kun datooplysningerne, ville der være meget mere end 18 resultater, da tider også tælles med.

Rediger:Ændret til INTERVAL -17 DAY at give op til 18 resultater i stedet for 19.



  1. hvordan man får LAST_INSERT_ID via lagret procedure i php

  2. MariaDB CURRENT_USER() Forklaret

  3. Brug af Geekbench 3 til at evaluere databaseserverens ydeevne

  4. Send data fra Android til server via JSON