sql >> Database >  >> RDS >> Mysql

ORDER BY Subquery voor GROUP BY to JOIN conversie

Dit kan worden vereenvoudigd tot het volgende (de ORDER BY in de subquery is nutteloos):

SELECT * 
FROM table
GROUP BY title

Waarom denk je dat je JOIN nodig hebt? ? (Ok, dit is opgelost door opmerkingen).

Na je opmerking die je voor elke titel nodig hebt, de rij met de grootste tijdstempel, zou dit het werk doen:

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

Voor de goede orde, uw oorspronkelijke vraag:

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

misschien werken zoals verwacht, maar:alleen in MySQL waarmee u kunt gebruiken in de SELECT lijstvelden die niet in de GROUP BY . staan clausule (of daarvan afhankelijk zijn), zonder enige geaggregeerde functies erin. Dus de bovenstaande zoekopdracht retourneert een min of meer willekeurig rij voor elke titel. In feite zal het de eerste rij retourneren die het voor een titel zal vinden. Dus, na eerst de subquery te hebben uitgevoerd (die wordt besteld op timestamp DESC ) resulteert in het vinden van de rij met de grootste tijdstempel.

Dit gebeurt echter alleen omdat (wanneer, als) de optimizer niet begrijpt dat de subquery nutteloos is. Het kan zijn dat uw oorspronkelijke zoekopdracht goed werkt wanneer u op een dag een upgrade uitvoert naar MySQL-versie 7.5 en uw zoekopdracht niet meer werkt zoals voorheen. (omdat de optimizer slimmer is geworden en uw zoekopdracht naar een eenvoudigere heeft vertaald zonder subselectie).

U kunt zelfs merken dat uw zoekopdracht helemaal niet meer werkt en fouten oplevert als MySQL in een toekomstige release besluit om in overeenstemming te zijn met de SQL-standaarden voor de GROUP BY vragen.



  1. Null-waarden sorteren na alle andere, behalve speciaal

  2. MariaDB JSON_ARRAY() uitgelegd

  3. MariaDB JSON_EXTRACT() uitgelegd

  4. MySQL-resultaten op IN-volgorde bestellen?