Mysql
 sql >> Baza danych >  >> RDS >> Mysql

MySQL grupuje według i max zwraca błędne wiersze

Cały czas napotykam ten problem. Gdy MySQL uruchamia funkcję agregującą dla dowolnych kolumn niezagregowanych, po prostu pobiera pierwsze dane, które napotka dla tej grupy, niezależnie od tego, czy pochodzą one z wiersza MAX, czy nie. Musisz więc uporządkować dane w wewnętrznym zapytaniu tak, aby maksymy były pierwsze w swoich grupach. Sprawdź, czy to działa dla Ciebie:

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
;

Zauważ, że nie używam tutaj funkcji MAX. Porządkowanie według wyniku malejąco, a następnie grupowanie według daty w zewnętrznym zapytaniu spowoduje wyświetlenie najwyższego wyniku według daty. Zauważ też, że w zapytaniu wewnętrznym umieściłem klauzulę WHERE. Zapytania wewnętrzne, takie jak to (choć czasami konieczne) nie są zbyt wydajne, ponieważ nie mają indeksów, na których można by zoptymalizować zapytanie zewnętrzne, więc upewnij się, że Twój wewnętrzny zestaw wyników jest tak mały, jak to tylko możliwe. Na koniec zwróć uwagę na GRUPA WEDŁUG DATY (t.pubdate_utc). Gdybym nie skrócił go tylko do informacji o dacie, byłoby znacznie więcej niż 18 wyników, ponieważ wtedy liczone są również czasy.

Edycja:zmieniono na INTERVAL -17 DAY dać do 18 wyników zamiast 19.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kiedy mam wywołać bind_param, jeśli używam przygotowanych instrukcji MySQLi w pętli?

  2. przywróć kopię zapasową mysql

  3. Jak stworzyć architekturę punktu w czasie w MySQL

  4. Entity Framework C# Wstaw dane rosyjskie problemy z kodowaniem

  5. Entity Framework Code First + MySQL... NullReferenceException