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

MySQL базирано на курсора пагинация с множество колони

Ако (назованата за съжаление) колона Column_1 е уникален, можете просто да направите:

 WHERE Column_1 > :last_retrieved_value

От въпроса изглежда, че Column_1 не е уникален, но (Column_1,Column_2) кортежът е уникален.

Общата форма за заявка "следваща страница", подредена по тези две колони, като се използват последните извлечени стойности за тези две колони, би била...

    (Column1,Column2) > (:lrv_col1,:lrv_col2)

(lrv =стойност, запазена от последния ред, извлечен от предишната заявка)

За да запишем това условие в MySQL, можем да направим това, както сте показали:

 WHERE t.Column_1 > :lrv_col1
    OR ( t.Column_1 = :lrv_col1 AND t.Column_2 > :lrv_col2 )

Или можем да го напишем така, което предпочитам, защото има много по-малък шанс MySQL да се обърка от условието ИЛИ и да използва грешен индекс...

 WHERE t.Column_1 >= :lrv_col1
       AND ( t.Column_1 > :lrv_col1 OR t.Column_2 > :lrv_col2 )
 ORDER BY t.Column_1, t.Column_2
 LIMIT n

За да разширите това до три колони, за да проверите условието...

  (c1,c2,c3) > (:lrv1,:lrv2,:lrv3)

Ние се справяме точно както в случая с две колони, обработвайки c1 първо, разбивайки го точно както двете колони:

 WHERE c1 >= :lrv1
       AND ( c1 > :lrv1 OR ( ... ) )
 ORDER BY c1, c2, c3
 LIMIT n

И сега този заместител ... (къде щеше да има само проверката на c2 преди, наистина отново е просто още един случай на две колони. Трябва да проверим:(c2,c3) > (lrv2,lrv3) , така че можем да го разширим, като използваме същия модел:

 WHERE c1 >= :lrv1
       AND ( c1 > :lrv1 OR ( c2 >= :lrv2 
                             AND ( c2 > :lrv2 OR c3 > :lrv3 )
                           )
           )
 ORDER BY c1,c2,c3
 LIMIT n

Съгласен съм, че разширението може да изглежда малко разхвърляно. Но тя следва много редовен модел. По същия начин бихме могли да изразим условието на четири колони...

 (c1,c2,c3,c4) > (:lrv1,:lrv2,:lrv3,:lrv4)

Просто вземаме това, което имаме за трите колони, и трябва да разширим c3 > :lrv3 за да го замените с ( c3 >= :lrv3 AND ( c3 > :lrv3 OR c4 > :lrv4 ) )

 WHERE c1 >= :lrv1
       AND ( c1 > :lrv1 OR ( c2 >= :lrv2 
                             AND ( c2 > :lrv2 OR ( c3 >= :lrv3
                                                   AND ( c3 > :lrv3 OR c4 > :lrv4 )
                                                 )
                                 )
                           )
           )
 ORDER BY c1,c2,c3,c4
 LIMIT n

Като помощ на бъдещия читател, бих коментирал този блок и бих посочил намерението ...

 -- (c1,c2,c3,c4) > (lr1,lr2,lr3,lr4)

И би било хубаво MySQL да ни позволи да изразим сравнението точно така. За съжаление, трябва да разширим това в нещо, което MySQL разбира.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. как да получите всички резултати от mysql tuple и да конвертирате в json

  2. Поддръжка за ограничаване на външния ключ в Rails

  3. Множество докер контейнери за mysql или един екземпляр с множество бази данни

  4. mySQL връща всички редове, когато поле=0

  5. Как да добавяте нови редове в jTable от база данни, докато щракнете върху бутона, без да изчиствате съществуващите редове