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

Il gruppo MySQL di e max restituisce righe errate

Mi imbatto in questo problema tutto il tempo. Quando MySQL esegue una funzione di aggregazione, per qualsiasi colonna non aggregata, estrae semplicemente i primi dati che attraversa per quel gruppo, indipendentemente dal fatto che provenga dalla riga MAX o meno. Quindi quello che devi fare è ordinare i dati in una query interna in modo tale che i massimi siano i primi nei loro gruppi. Vedi se questo funziona per te:

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
;

Si noti che non uso alcuna funzione MAX qui. Ordinando per punteggio decrescente e quindi raggruppando per data nella query esterna verrà visualizzato il punteggio più alto per data. Si noti inoltre che ho inserito la clausola WHERE nella query interna. Query interne come questa (anche se a volte necessarie) non sono molto efficienti, poiché non hanno indici su cui ottimizzare la query esterna, quindi assicurati che il tuo set di risultati interno sia il più piccolo possibile. Infine, notare il GROUP BY DATE(t.pubdate_utc). Se non lo riducessi alle sole informazioni sulla data, ci sarebbero molti più di 18 risultati, poiché allora vengono contati anche i tempi.

Modifica:modificato in INTERVAL -17 DAY per dare fino a 18 risultati invece di 19.