Mysql
 sql >> Database >  >> RDS >> Mysql

ORDER BY Sottoquery per la conversione da GROUP BY a JOIN

Questo può essere semplificato come segue (il ORDER BY nella sottoquery è inutile):

SELECT * 
FROM table
GROUP BY title

Perché pensi di aver bisogno di JOIN ? (Ok, questo è stato risolto dai commenti).

Dopo il tuo commento di cui hai bisogno per ogni titolo, la riga con il timestamp più grande, questo farebbe il lavoro:

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

Per la cronaca, la tua domanda originale:

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

potrebbe funziona come previsto, ma:solo in MySQL che ti consente di utilizzare in SELECT elenca i campi che non sono nel GROUP BY clausola (o dipendono da quelle), senza alcuna funzione aggregata in esse. Quindi, la query sopra restituirà un più o meno casuale riga per ogni titolo. In effetti, restituirà la prima riga che troverà per un titolo. Quindi, dopo aver eseguito prima la sottoquery (che ordina per timestamp DESC ) trova per prima la riga con il timestamp più grande.

Questo, tuttavia, accade solo perché (quando, se) l'ottimizzatore non capisce che la sottoquery è inutile. Potresti scoprire che la tua query originale funziona correttamente quando un giorno esegui l'aggiornamento a MySQL versione 7.5 e la tua query smette di funzionare come prima. (perché l'ottimizzatore è diventato più intelligente e ha tradotto la tua query in una più semplice senza sottoselezionare).

Potresti anche scoprire che la tua query smette di funzionare del tutto e produce un errore se MySQL decide in una versione futura di essere in termini di standard SQL per GROUP BY interrogazioni.