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

Vælg en række og rækker rundt om den

Kun én ORDER BY klausul kan defineres for en UNION ville forespørge. Det er lige meget, om du bruger UNION eller UNION ALL . MySQL understøtter LIMIT klausul om dele af en UNION 'd forespørgsel, men det er relativt ubrugeligt uden mulighed for at definere rækkefølgen.

MySQL mangler også rangeringsfunktioner, som du skal bruge for at håndtere huller i dataene (mangler på grund af slettede poster). Det eneste alternativ er at bruge en stigende variabel i SELECT-sætningen:

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

Nu kan vi få en fortløbende nummereret liste over rækkerne, så vi kan bruge:

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

Brug af 7 som værdi for @midtpunkt, @midpoint - ROUND(@midpoint/2) returnerer værdien 4 . For at få 10 rækker i alt skal du indstille @upperlimit-værdien til 10. Her er hele forespørgslen:

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 hvis du stadig vil bruge LIMIT , kan du bruge:

  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. Opdag fremtidige duplikerede værdier, mens du itererer gennem MySQL-resultater i PHP

  2. Sådan deaktiveres en fremmednøglebegrænsning i SQL Server (T-SQL-eksempler)

  3. XML-tabel med Oracle 11g

  4. Er SELECT eller INSERT i en funktion tilbøjelig til raceforhold?