sql >> Databasteknik >  >> RDS >> Mysql

Välj en rad och rader runt den

Endast en ORDER BY sats kan definieras för en UNION skulle fråga. Det spelar ingen roll om du använder UNION eller UNION ALL . MySQL stöder LIMIT sats på delar av en UNION 'd fråga, men det är relativt värdelöst utan möjlighet att definiera ordningen.

MySQL saknar också rankningsfunktioner, vilket du behöver för att hantera luckor i data (saknas på grund av att poster raderas). Det enda alternativet är att använda en inkrementerande variabel i SELECT-satsen:

SELECT t.id, 
       @rownum := @rownum+1 as rownum 
  FROM MEDIA t, (SELECT @rownum := 0) r

Nu kan vi få en fortlöpande numrerad lista över raderna, så att vi kan använda:

WHERE rownum BETWEEN @midpoint - ROUND(@midpoint/2) 
                 AND @midpoint - ROUND(@midpoint/2) [email protected]

Använder 7 som värde för @midpoint, @midpoint - ROUND(@midpoint/2) returnerar värdet 4 . För att få 10 rader totalt, ställ in @upperlimit-värdet till 10. Här är hela frågan:

SELECT x.* 
  FROM (SELECT t.id, 
               @rownum := @rownum+1 as rownum 
          FROM MEDIA t, 
               (SELECT @rownum := 0) r) x
 WHERE x.rownum BETWEEN @midpoint - ROUND(@midpoint/2) AND @midpoint - ROUND(@midpoint/2) + @upperlimit

Men om du fortfarande vill använda LIMIT , kan du använda:

  SELECT x.* 
    FROM (SELECT t.id, 
                 @rownum := @rownum+1 as rownum 
            FROM MEDIA t, 
                 (SELECT @rownum := 0) r) x
   WHERE x.rownum >= @midpoint - ROUND(@midpoint/2)
ORDER BY x.id ASC
   LIMIT 10


  1. Hur Ln()-funktionen fungerar i PostgreSQL

  2. Ansible idempotent MySQL installation Playbook

  3. Hur man byter namn på tabell i MySQL

  4. SQL Server Collection Inventory Script -1