Mysql
 sql >> база данни >  >> RDS >> Mysql

Изберете ред и редове около него

Само един ORDER BY клаузата може да бъде дефинирана за UNION бих запитал. Няма значение дали използвате UNION или UNION ALL . MySQL поддържа LIMIT клауза за части от UNION бих поискал, но е относително безполезен без възможността за дефиниране на реда.

MySQL също няма функции за класиране, които трябва да се справите с пропуски в данните (липсващи поради изтриване на записи). Единствената алтернатива е да използвате нарастваща променлива в израза SELECT:

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

Сега можем да получим последователно номериран списък с редовете, за да можем да използваме:

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

Използване на 7 като стойност за @midpoint, @midpoint - ROUND(@midpoint/2) връща стойност от 4 . За да получите общо 10 реда, задайте стойността @upperlimit на 10. Ето пълната заявка:

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

Но ако все пак искате да използвате LIMIT , можете да използвате:

  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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Защо Rails игнорира Rollback в (псевдо)вложена транзакция?

  2. Динамичен курсор в съхранената процедура

  3. MySQL високо използване на процесора

  4. MySQL JDBC драйвер 5.1.33 – Проблем с часовата зона

  5. Архивиране и възстановяване на MySQL база данни в PHP