Mysql
 sql >> база данни >  >> RDS >> Mysql

Подзаявка ORDER BY за преобразуване GROUP BY към JOIN

Това може да се опрости до следното (ORDER BY в подзаявката е безполезна):

SELECT * 
FROM table
GROUP BY title

Защо мислите, че имате нужда от JOIN ? (Добре, това беше разрешено с коментари).

След вашия коментар, който ви е необходим за всяко заглавие, реда с най-голямо времеви печат, това ще свърши работата:

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

За протокола, оригиналната ви заявка:

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

може да работи според очакванията, но:само в MySQL, което ви позволява да използвате в SELECT избройте полета, които не са в GROUP BY клауза (или зависи от тях), без никакви агрегатни функции в тях. Така че горната заявка ще върне повече или по-малко произволна ред за всяко заглавие. Всъщност той ще върне първия ред, който ще намери за заглавие. И така, след като първо стартирате подзаявката (която подрежда по timestamp DESC ) води до намиране на първия ред с най-голямо времеви печат.

Това обаче се случва само защото (кога, ако) оптимизаторът не разбира, че подзаявката е безполезна. Може да откриете, че оригиналната ви заявка работи добре, когато един ден надстроите до MySQL версия 7.5 и заявката ви спре да работи както преди. (тъй като оптимизаторът стана по-умен и преведе заявката ви в по-опростена без под-селекция).

Може дори да откриете, че вашата заявка спира да работи напълно и създава грешка, ако MySQL реши в бъдеща версия да бъде в съответствие със стандартите на SQL за GROUP BY запитвания.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mysql_connect (localhost / 127.0.0.1) бавен на платформата Windows

  2. Как да INSERT Ако ред не съществува (UPSERT) в MySQL

  3. MySql преносима версия

  4. вмъкване на данни от една таблица в друга в mysql

  5. Какво означава INT(5) в mysql?