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

BESTIL EFTER Underforespørgsel for GROUP BY to JOIN-konvertering

Dette kan forenkles til følgende (ORDER BY). i underforespørgslen er ubrugelig):

SELECT * 
FROM table
GROUP BY title

Hvorfor tror du, at du har brug for JOIN ? (Ok, dette blev løst med kommentarer).

Efter din kommentar, som du har brug for til hver titel, rækken med det største tidsstempel, ville dette gøre arbejdet:

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

For en god ordens skyld, din oprindelige forespørgsel:

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

måske arbejde som forventet, men:kun i MySQL, der giver dig mulighed for at bruge i SELECT liste felter, der ikke er i GROUP BY klausul (eller afhænger af dem), uden nogen aggregerede funktioner i dem. Så ovenstående forespørgsel vil returnere en mere eller mindre tilfældig række for hver titel. Faktisk vil den returnere den første række, den finder for en titel. Så efter først at have kørt underforespørgslen (som sorterer efter tidsstempel DESC ) resulterer i først at finde rækken med det største tidsstempel.

Dette sker dog kun, fordi (når, hvis) optimeringsværktøjet ikke forstår, at underforespørgslen er ubrugelig. Du kan opleve, at din oprindelige forespørgsel kører fint, når du en dag opgraderer til MySQL version 7.5, og din forespørgsel holder op med at fungere som før. (fordi optimeringsværktøjet blev mere smart og oversatte din forespørgsel til en enklere uden undervalg).

Du kan endda finde ud af, at din forespørgsel helt stopper med at fungere og producerer fejl, hvis MySQL i en fremtidig udgivelse beslutter at være i overensstemmelse med SQL-standarderne for GROUP BY forespørgsler.



  1. MariaDB:Kan jeg hente duplikerede kolonnenavne uden at bruge 'AS'

  2. Søg i GROUP_CONCAT ved at bruge LIKE

  3. Hvordan har man komplet offline funktionalitet i en webapp med PostgreSQL-database?

  4. Skift gennem udklipsholderring i SQL Server Management Studio (SSMS) - SQL Server / TSQL vejledning del 8