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

Podzapytanie ORDER BY dla konwersji GROUP BY na JOIN

Można to uprościć do następującego (ORDER BY w podzapytaniu jest bezużyteczne):

SELECT * 
FROM table
GROUP BY title

Dlaczego uważasz, że potrzebujesz JOIN ? (Ok, zostało to rozwiązane przez komentarze).

Po komentarzu, którego potrzebujesz dla każdego tytułu, wiersza z największym znacznikiem czasu, to zadziała:

SELECT t.* 
FROM
    table AS t
  JOIN
    ( SELECT title
           , MAX(timestamp) AS maxts
      FROM table
      GROUP BY title
    ) AS grp
    ON grp.title = t.title
    AND grp.maxts = t.timestamp
ORDER BY t.timestamp DESC

Dla przypomnienia, Twoje pierwotne zapytanie:

SELECT * 
FROM 
  ( SELECT * 
    FROM table 
    ORDER BY timestamp DESC 
  ) m
GROUP BY title

może działa zgodnie z oczekiwaniami, ale:tylko w MySQL, który pozwala na użycie w SELECT lista pól, które nie znajdują się w GROUP BY (lub od nich zależą), bez żadnych funkcji agregujących w nich. Tak więc powyższe zapytanie zwróci mniej lub bardziej losowe wiersz dla każdego tytułu. W rzeczywistości zwróci pierwszy wiersz, który znajdzie dla tytułu. Tak więc, po pierwszym uruchomieniu podzapytania (które porządkuje według timestamp DESC ) powoduje znalezienie pierwszego wiersza z największym znacznikiem czasu.

Dzieje się tak jednak tylko dlatego, że (kiedy, jeśli) optymalizator nie rozumie, że podzapytanie jest bezużyteczne. Może się okazać, że Twoje oryginalne zapytanie działa poprawnie, gdy pewnego dnia dokonasz aktualizacji do MySQL w wersji 7.5 i Twoje zapytanie przestanie działać tak jak wcześniej. (ponieważ optymalizator stał się bardziej sprytny i przetłumaczył Twoje zapytanie na prostsze bez podwyboru).

Możesz nawet stwierdzić, że Twoje zapytanie całkowicie przestanie działać i spowoduje błąd, jeśli MySQL zdecyduje, że w przyszłej wersji będzie zgodne ze standardami SQL dla GROUP BY zapytania.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jaka jest różnica między używaniem i włączaniem w tabelach złączeń w MySQL?

  2. Wykonaj instrukcję skrótem w MySQLWorkbench

  3. Jak zabezpieczyć pliki przed nieautoryzowanym pobieraniem

  4. Jak wyświetlić sortowanie kolumny w MySQL

  5. Jak pobrać wynik z wiersza MySQL z wieloma kolumnami o tej samej nazwie za pomocą PHP?