sql >> Database >  >> RDS >> Mysql

MySQL group by en max retourneert verkeerde rijen

Ik loop de hele tijd tegen dit probleem aan. Wanneer MySQL een aggregatiefunctie uitvoert, voor alle niet-geaggregeerde kolommen, haalt het gewoon de eerste gegevens op die het voor die groep tegenkomt, of het nu uit de MAX-rij komt of niet. Dus wat u moet doen, is de gegevens in een interne query ordenen, zodat de maxes als eerste in hun groepen staan. Kijk of dit voor jou werkt:

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
;

Merk op dat ik hier geen MAX-functie gebruik. Sorteren op score aflopend en vervolgens groeperen op datum in de buitenste zoekopdracht zal de hoogste score op datum opleveren. Merk ook op dat ik de WHERE-component in de inner query heb geplaatst. Innerlijke zoekopdrachten zoals deze (die soms nodig zijn) zijn niet erg efficiënt, omdat ze geen indexen hebben voor de buitenste zoekopdracht om op te optimaliseren, dus zorg ervoor dat je innerlijke resultatenset zo klein mogelijk is. Let ten slotte op de GROUP BY DATE(t.pubdate_utc). Als ik het niet zou reduceren tot alleen de datuminformatie, zouden er veel meer dan 18 resultaten zijn, omdat dan ook de tijden worden geteld.

Bewerken:gewijzigd in INTERVAL -17 DAY om maximaal 18 resultaten te geven in plaats van 19.



  1. Hoe grafieken en diagrammen te genereren uit de mysql-database in php

  2. Werken met SQL-cursors

  3. CAST() versus TRY_CAST() in SQL Server:wat is het verschil?

  4. MySQL-triggers gebruiken