2009-03-02 17 views
27

मैं चयनित पंक्तियों के साथ-साथ चयनित डेटा की संख्या प्राप्त करना चाहता हूं।sqlite3 से चयनित परिणाम की पंक्तियों की संख्या कैसे प्राप्त करें?

एक

select * from XXX where XXX; 

अन्य है

select count(*) from XXX where XXX; 

यह एक एकल एसक्यूएल तार के साथ महसूस किया जा सकता है: वर्तमान में मैं दो एसक्यूएल बयान उपयोग करना पड़ेगा?

मैंने sqlite3 के स्रोत कोड की जांच की है, और मुझे sqlite3_changes() का फ़ंक्शन मिला। लेकिन फ़ंक्शन केवल तभी उपयोगी होता है जब डेटाबेस बदल जाता है (insert, delete or update के बाद)।

क्या कोई मुझे इस समस्या से मदद कर सकता है? आपका बहुत बहुत धन्यवाद!

+0

हालांकि जवाब है हां, उत्तरों की सबसे नीचे जटिलता आप से बचना चाहिए जोड़ें। दो प्रश्नों को चलाने में कुछ भी गलत नहीं है।यदि आप क्वेरी के बाद डेटा को संसाधित कर रहे हैं, तो आप जिस भाषा का उपयोग कर रहे हैं उसके आधार पर आप अपने परिणामस्वरूप संग्रह ऑब्जेक्ट की 'गिनती() 'या' आकार() 'विधियों का भी उपयोग कर सकते हैं। – alttag

उत्तर

0

एक बार आपके पास पहले से ही select * from XXX परिणाम हैं, तो आप केवल अपने प्रोग्राम में सरणी की लंबाई पा सकते हैं?

+1

मैं कर सकता हूँ। लेकिन केवल तब तक जब तक मैं सभी परिणाम पंक्तियों से गुजरता हूं। मैं जितनी जल्दी हो सके गिनती प्राप्त करना चाहता हूं – user26404

+2

उस स्थिति में, मुझे लगता है कि दो SQL क्वेरी चलाना वास्तव में सबसे सरल समाधान है। –

2

आप उन्हें एक ही बयान में जोड़ सकता:

select count(*), * from XXX where XXX 

या

select count(*) as MYCOUNT, * from XXX where XXX 
+3

यह केवल पंक्ति गणना और केवल अंतिम पंक्ति देता है। – idursun

+1

हां, मुझे इस विधि का उपयोग कर सटीक परिणाम पंक्तियां नहीं मिल सकती हैं। – user26404

0

आप के बजाय sqlite3_get_table का उपयोग करते हैं तैयार/कदम/अंतिम रूप देने के आप एक सरणी में एक बार में सभी परिणाम मिलेंगे ("परिणाम तालिका"), कॉलम की संख्या और नाम, और पंक्तियों की संख्या सहित। फिर आपको परिणाम sqlite3_free_table

+0

धन्यवाद। मैं कोशिश करूँगा – user26404

+3

तो, यदि आपके पास 9 बिलियन पंक्तियां हैं, तो आप अपनी पूरी मेमोरी और हार्ड ड्राइव को भरने की उम्मीद करते हैं ताकि आप जान सकें कि आपके पास कितनी पंक्तियां हैं? गिनती के साथ लूप के लिए यह भी बदतर है + = sqlite3_step() == SQLITE3_ROW; – xryl669

13

एसक्यूएल एकल-पंक्ति (गिनती) और बहु-पंक्ति परिणाम (आपकी तालिकाओं से डेटा का चयन) मिश्रण नहीं कर सकता है। बड़ी मात्रा में डेटा लौटने के साथ यह एक आम समस्या है। यहां कुछ सुझाव दिए गए हैं कि इसे कैसे संभालें:

  • पहली एन पंक्तियां पढ़ें और उपयोगकर्ता को "एन पंक्तियों से अधिक उपलब्ध" बताएं। बहुत सटीक नहीं है लेकिन अक्सर पर्याप्त अच्छा है। यदि आप कर्सर को खोलते हैं, तो उपयोगकर्ता दृश्य के नीचे हिट करते समय अधिक डेटा प्राप्त कर सकता है (Google रीडर यह करता है)

  • सीधे डेटा का चयन करने के बजाय, इसे पहले एक अस्थायी तालिका में कॉपी करें। INSERT कथन कॉपी की गई पंक्तियों की संख्या वापस कर देगा। बाद में, आप डेटा प्रदर्शित करने के लिए अस्थायी तालिका में डेटा का उपयोग कर सकते हैं। पेजिंग को और अधिक सरल बनाने के लिए आप इस अस्थायी तालिका में "पंक्ति संख्या" जोड़ सकते हैं।

  • पृष्ठभूमि धागे में डेटा प्राप्त करें। यह उपयोगकर्ता को आपके आवेदन का उपयोग करने की अनुमति देता है जबकि डेटा ग्रिड या तालिका अधिक डेटा के साथ भरती है।

15

इस तरह

select (select count() from XXX) as count, * 
from XXX; 
+0

स्वयं की पहली पंक्ति मेरे लिए काम करती है "गिनती के रूप में चुनें (XXX से गिनती चुनें));" ... धन्यवाद। – samosaris

+3

यदि आप पंक्तियों की गिनती प्राप्त करने की अपेक्षा करते हैं तो पहली पंक्ति अत्यधिक जटिल होती है। बस "चुनें COUNT (*) xxx से गणना के रूप में;"। – xryl669

2
select (select COUNT(0) 
      from xxx t1 
      where t1.b <= t2.b 
      ) as 'Row Number', b from xxx t2 ORDER BY b; 

सिर्फ this कोशिश की कोशिश करो।

+0

यह वास्तव में आपकी आउटपुट पंक्तियों में एक इंडेक्स जोड़ता है, लेकिन पंक्तियों की गणना नहीं करता है (जब तक कि आप अंतिम पंक्ति तक नहीं पहुंच जाते) जो "XXX से चुनें" से बेहतर नहीं है; और SQLite3_ROW को वापस करने वाले sqlite3_row() की संख्या गिनती है, और यह आपके आउटपुट को भी सॉर्ट करता है जो अप्रत्याशित हो सकता है। – xryl669

0

आप इस प्रयास करना चाहिए:

select (select count() from XXX) as count, * from XXX; 
संबंधित मुद्दे

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