sql >> Databáze >  >> RDS >> Mysql

MySQL group by a max vrací nesprávné řádky

S tímto problémem se setkávám neustále. Když MySQL spustí agregační funkci, pro všechny neagregované sloupce jednoduše stáhne první data, která pro danou skupinu spustí, ať už jsou z řádku MAX nebo ne. Takže co musíte udělat, je seřadit data ve vnitřním dotazu tak, aby maxima byla první ve svých skupinách. Podívejte se, jestli vám to funguje:

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
;

Všimněte si, že zde nepoužívám žádnou funkci MAX. Seřazení podle skóre sestupně a poté seskupení podle data ve vnějším dotazu vyvolá nejvyšší skóre podle data. Všimněte si také, že jsem do vnitřního dotazu vložil klauzuli WHERE. Vnitřní dotazy, jako je tento (které jsou někdy nutné), nejsou příliš efektivní, protože nemají žádné indexy pro vnější dotaz, které by bylo možné optimalizovat, takže se ujistěte, že vaše vnitřní sada výsledků je tak malá, jak jen může být. Nakonec si všimněte GROUP BY DATE(t.pubdate_utc). Kdybych to nezredukoval jen na informaci o datu, bylo by mnohem více než 18 výsledků, protože se pak počítají i časy.

Edit:Změněno na INTERVAL -17 DAY dát až 18 výsledků místo 19.



  1. Další z mých oblíbených PostgreSQL dotazů – a proč na nich také záleží

  2. sql vytažením řádku pro další nebo předchozí řádek aktuálního řádku

  3. Python:osvědčený postup a nejbezpečnější způsob připojení k MySQL a provádění dotazů

  4. JDBC - Oracle ArrayIndexOutOfBoundsException