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 के लिए OR शर्त से भ्रमित होने और गलत इंडेक्स का उपयोग करने की संभावना बहुत कम है...

 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. PDOException SQLSTATE [HY000] [2002] ऐसी कोई फ़ाइल या निर्देशिका नहीं

  2. PHP-MySQL-MySQL पूर्णांक फ़ील्ड को सुरक्षित रूप से कैसे बढ़ाएँ?

  3. कैसे जांचें कि MySQL डेटाबेस में मान मौजूद है या नहीं

  4. सफल निष्पादन के बाद मेरी नोडज स्क्रिप्ट अपने आप बाहर नहीं निकल रही है

  5. MySQL में INT और UUID के बीच अंतर