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

ORDER BY Poddotaz pro převod GROUP BY na JOIN

To lze zjednodušit na následující (ORDER BY v poddotazu je k ničemu):

SELECT * 
FROM table
GROUP BY title

Proč si myslíte, že potřebujete JOIN ? (Dobře, bylo to vyřešeno komentáři).

Po vašem komentáři, který potřebujete pro každý titul, řádek s největším časovým razítkem, by to fungovalo:

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

Pro záznam, váš původní dotaz:

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

možná fungovat podle očekávání, ale:pouze v MySQL, který vám umožňuje použít v SELECT seznam polí, která nejsou v GROUP BY klauzule (nebo na nich závisí), bez jakýchkoli agregačních funkcí v nich. Výše uvedený dotaz tedy vrátí víceméně náhodný řádek pro každý titul. Ve skutečnosti vrátí první řádek, který najde pro titul. Po prvním spuštění dílčího dotazu (který se řadí podle timestamp DESC ) vede k nalezení prvního řádku s největším časovým razítkem.

K tomu však dochází pouze proto, že (kdy, pokud) optimalizátor nechápe, že poddotaz je k ničemu. Možná zjistíte, že váš původní dotaz běží dobře, když jednoho dne upgradujete na MySQL verzi 7.5 a váš dotaz přestane fungovat jako předtím. (protože optimalizátor byl chytřejší a přeložil váš dotaz na jednodušší bez podvýběru).

Pokud se MySQL v budoucí verzi rozhodne, že bude v souladu se standardy SQL pro GROUP BY, můžete dokonce zjistit, že váš dotaz úplně přestane fungovat a způsobí chybu. dotazy.



  1. Java, MySQL:Existuje způsob, jak vložit server MySQL s programem Java?

  2. Kde najdu seznam chybových kódů SQLException pro MySQL?

  3. Zkrácení všech tabulek v databázi na serveru SQL - SQL Server / TSQL výukový program, část 55

  4. Funkce NVL2 v Oracle