sql >> Databáze >  >> RDS >> Mysql

Stránkování založené na kurzoru MySQL s více sloupci

If (nešťastně pojmenovaný) sloupec Column_1 je jedinečný, můžete to udělat:

 WHERE Column_1 > :last_retrieved_value

Z otázky vyplývá, že Column_1 není jedinečný, ale (Column_1,Column_2) n-tice je jedinečný.

Obecný formulář pro dotaz „další stránka“ seřazený podle těchto dvou sloupců s použitím posledních načtených hodnot pro tyto dva sloupce by byl...

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

(lrv =hodnota uložená z posledního řádku načteného předchozím dotazem)

Chcete-li zapsat tuto podmínku v MySQL, můžeme to udělat, jak jste ukázali:

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

Nebo bychom to mohli napsat takto, čemuž dávám přednost, protože je mnohem menší šance, že se MySQL zmýlí podmínkou OR a použije nesprávný index...

 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

Chcete-li to rozšířit na tři sloupců, pro kontrolu stavu...

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

Řešíme to stejně jako v případě dvou sloupců, zpracováváme c1 nejprve jej rozdělte stejně jako dva sloupce:

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

A teď ten zástupný symbol ... (kde by byla pouze kontrola na c2 dříve, je ve skutečnosti opět jen dalším případem dvou sloupců. Musíme zkontrolovat:(c2,c3) > (lrv2,lrv3) , takže to můžeme rozšířit pomocí stejného vzoru:

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

Souhlasím, že rozšíření může vypadat trochu chaoticky. Ale řídí se velmi pravidelným vzorem. Podobně bychom mohli vyjádřit podmínku na čtyři sloupce...

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

Vezmeme jen to, co máme pro tři sloupce, a musíme rozšířit c3 > :lrv3 nahradit jej řetězcem ( 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

Jako pomůcku pro budoucího čtenáře bych tento blok okomentoval a naznačil záměr ...

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

A bylo by hezké, kdyby nám MySQL umožnilo vyjádřit srovnání právě takto. Bohužel to musíme rozšířit na něco, čemu MySQL rozumí.




  1. jak mohu vytvořit nový soubor XML z existující databáze v databázi PostgreSQL pomocí javy

  2. mysql seznam kategorií a podkategorií

  3. Kontingenční tabulka s nekardinálními hodnotami

  4. Oracle Database BLOB na InputStream v Javě?