2016-01-02 5 views
5

मैं उपयोगकर्ताओं को खोजने के लिए एक खोज पृष्ठ बना रहा हूं। मेरे पास उन्हें खोजने के लिए que क्वेरी है और वास्तव में मैं "LIMIT startRow, numberRows" के साथ पेजिनेशन कर सकता हूं। लेकिन मैं अंकन करने से पहले "रजिस्टरों" की कुल संख्या कैसे गिन सकता हूं? मैं अपने खोज पेज पर, खोज में पाए गए उपयोगकर्ताओं की संख्या जोड़ना चाहता हूं।MySQL - अंकन से पहले पंक्तियों को कैसे गिनें?

मुझे कुछ ऐसा चाहिए: "100 का पृष्ठ 1"। मैं वास्तव में मेरे पास "पृष्ठ 1" है लेकिन मुझे नहीं पता कि पेजिनेट से पहले कुल परिणामों की गणना कैसे करें।

¿शायद "SELECT COUNT (*)" के साथ एक अतिरिक्त क्वेरी निष्पादित कर सकते हैं? ¿क्या किसी अन्य प्रश्न से बचने के लिए अंकन से पहले गिनने का कोई और तरीका है?

मैं दो एसक्यूएल प्रश्नों, एक शब्द के लिए एक का उपयोग करें, और बहु-शब्दों के लिए एक और:

बेस एसक्यूएल क्वेरी (एक शब्द और बहु ​​शब्द खोज के लिए):

"SELECT * FROM accounts AS A INNER JOIN profiles AS P ON A.account_id = P.account_id " 

एकल शब्द हालत:

"WHERE A.username LIKE ? OR P.name LIKE ? OR P.name LIKE ? OR P.surname LIKE ? OR P.surname LIKE ? LIMIT ?,?" 

मल्टी शब्द हालत:

"WHERE CONCAT(P.name, ' ', P.surname) LIKE ? LIMIT ?,?" 

बहुत बहुत धन्यवाद।

+0

वहाँ किसी कारण आप [displaytag] (http://www.displaytag.org/1.2/) का उपयोग नहीं कर सकता है? –

+0

मुझे उस पुस्तकालय के बारे में पता नहीं था। मुझे एक और खोज विधि के लिए दिलचस्प लगता है जिसकी मुझे आवश्यकता होगी। इसके बावजूद मैं अंकन से पहले कुल परिणामों की गणना करने के बारे में जानना चाहता हूं, 'क्योंकि मैं सीख रहा हूं। धन्यवाद। – wilmerlpr

उत्तर

2

इस तरह क्वेरी संशोधित:

SELECT SQL_CALC_FOUND_ROWS * FROM accounts ... LIMIT ... 

यह वही सीमित/ऑफसेट परिणाम से पहले के रूप में (परिणामों के प्रथम पृष्ठ, उदाहरण के लिए) वापस आ जाएगी, लेकिन अगर आप तो तुरंत करने के लिए यह दूसरा क्वेरी भेज सर्वर ...

SELECT FOUND_ROWS(); 

सर्वर पंक्तियों कि अगर LIMIT पिछली क्वेरी पर लगाया नहीं किया गया था लौटा दिए गए हैं की कुल संख्या की गिनती वापस आ जाएगी। परिणाम की कुल संख्या है।

यह निश्चित रूप से इसका अर्थ होगा कि आपकी प्रारंभिक क्वेरी अधिक समय लेती है, क्योंकि ऑप्टिमाइज़र कोई शॉर्टकट नहीं ले सकता है जो LIMIT संतुष्ट होने के बाद पंक्तियों का मूल्यांकन रोकने की अनुमति दे सकता है, लेकिन कुछ मामलों में, ऐसे शॉर्टकट नहीं हैं वैसे भी उपलब्ध है।

यह जो आप पूरा करने की कोशिश कर रहे हैं, उसके लिए यह "आधिकारिक" तंत्र है।

http://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_found-rows

+1

अंत में! यह काम करता है क्योंकि मैं एसपी था ecting। "जैसे" फ़िल्टर के साथ अधिक संसाधनों का उपभोग किए बिना एक छोटी सी क्वेरी। आपके उत्तर के लिए धन्यवाद। – wilmerlpr

0

आप इस्तेमाल कर सकते हैं कुछ इस तरह करते हैं:

SELECT (select count(*) from produtos) as counter, column1, column2, column3, column4 FROM accounts AS A INNER JOIN profiles AS P ON A.account_id = P.account_id WHERE A.username LIKE ? OR P.name LIKE ? OR P.name LIKE ? OR P.surname LIKE ? OR P.surname LIKE ? LIMIT ?,?; 
इसके बजाय सभी (*) प्रत्येक स्तंभ का नाम, आप उपयोग के चयन का

, और एक अन्य स्तंभ काउंटर बुलाया पैदा करते हैं।

+0

यह केवल "WHERE" फ़िल्टर को छोड़कर डेटाबेस में प्रविष्टियों की कुल संख्या दिखाता है। अगर मैं इसे "COUNT (*) के रूप में कुल मिलाकर, कॉलम 2, ..."यह" WHERE "फ़िल्टर से मेल खाने वाली पंक्तियों की संख्या दिखाता है, लेकिन mysql के परिणाम में केवल एक पंक्ति है जो क्वेरी का पहला है और इसमें" कुल "नया कोलम भी है जो वास्तव में उस नंबर पर है मैं चाहता हूं कि अंकन से पहले पंक्तियों की संख्या। आपके उत्तर के लिए धन्यवाद। – wilmerlpr

+0

इसके बारे में क्या? चयन करें (खातों से गिनती (*) चुनें, जैसे कि एक INNER जॉइन प्रोफाइल AS P पर Aaccount_id = P.account_id जहां उपयोगकर्ता नाम पसंद है? या पी। नाम पसंद है? या पी। नाम पसंद है? या पी। शर्नम पसंद है? या पी। शर्नम पसंद है?) काउंटर, कॉलम 1, कॉलम 2, कॉलम 3, कॉलम 4 के रूप में खातों से एक इंटर्न जॉइन प्रोफाइल के रूप में एसीसी पर एसीसी = P.account_id जहां उपयोगकर्ता नाम पसंद है? या पी। नाम पसंद है? या पी। नाम पसंद है? या पी। नाम पसंद है? या पी। शर्नम पसंद है? लिमिटेड ?, बड़ी क्वेरी की तरह, जिसे बेहतर किया जा सकता है, लेकिन मुझे उम्मीद है कि यह मदद करता है :) –

संबंधित मुद्दे