2009-07-14 12 views
13

का उपयोग करते समय पंक्तियों की कुल संख्या गणना करें, मैं एक साधारण छवि गैलरी बनाने की कोशिश कर रहा हूं, प्रति पृष्ठ 16 छवियां दिखा रहा हूं। मैं पृष्ठ पर सही राशि प्रदर्शित करने के लिए LIMIT 16 का उपयोग कर रहा हूं, लेकिन यदि 16 से अधिक पंक्तियां हैं, तो मैं नीचे दिए गए लिंक रखना चाहता हूं, जिससे उपयोगकर्ता अगले पृष्ठ पर नेविगेट कर सकता है।एसक्यूएल LIMIT

मुझे पता है कि मैं सीमा को हटाकर वांछित परिणाम प्राप्त कर सकता हूं और पहले 16 आइटम प्रदर्शित करने के लिए बस एक लूप का उपयोग कर सकता हूं, लेकिन यह अक्षम होगा। जाहिर है, पंक्तियों की संख्या हमेशा = 16

$sql .= "posts p, images im, postimages pi WHERE 
    i.active = 1 
    AND pi.post_id = p.id 
    AND pi.image_id = im.image_id 
    ORDER BY created_at LIMIT 16"; 

क्या कोई इसे करने का एक और अधिक प्रभावी तरीका सुझा सकता है?

धन्यवाद

उत्तर

1

आप दिए गए पृष्ठ आप गिनती कि प्राप्त करने के लिए अलग प्रश्न के अतिरिक्त पर हैं के लिए अपने परिणामों को ऑफसेट करने के लिए की जरूरत है हर कोई और उल्लेख किया है।

$sql .= "posts p, images im, postimages pi WHERE 
    i.active = 1 
    AND pi.post_id = p.id 
    AND pi.image_id = im.image_id 
    ORDER BY created_at 
    LIMIT ". ($page - 1) * $pagesize .", ". $pagesize; 

एसक्यूएल इंजेक्शन के बारे में सामान्य चेतावनियां यहां लागू होंगी।

+0

+1। – andyk

3

आप पूरी तरह से पृष्ठ पर अंक लगाना करने के लिए, या बस this page और next page है की कोशिश कर रहे हैं? यदि यह उत्तरार्द्ध है तो आप बस LIMIT 17 कर सकते हैं और परिणाम की पंक्तियों की गणना कर सकते हैं। यदि आपको 17 मिलते हैं तो आपको पेजिंग करना होगा।

3

कोई सीमा नहीं है कि केवल गिनती देता है।

+0

सबसे ऊपर दिए गए उत्तर के प्रकाश में, क्या आप और बता सकते हैं कि आप यह क्यों कहते हैं? –

+1

@ टिपेटर्सन यह भी एक वैध विकल्प है। डेटाबेस में दो बार हिट करने के साथ इसमें कुछ समस्याएं हैं, लेकिन यह अभी भी पूरी तरह वैध है (यदि कम 'कुशल') उत्तर है। और जहां तक ​​यह दक्षता है, आप जो भी कर रहे हैं उसके आधार पर, कभी-कभी शीर्ष रेटेड उत्तर आपको एक ही जानकारी प्राप्त करने के दो अलग-अलग तरीकों से डीआरवाई का उल्लंघन कर सकता है। SQL इंजेक्शन पर नोटिस के लिए – RonLugge

0

उपयोग दो प्रश्नों, जहां एक आपकी क्वेरी है और अन्य है:

SELECT COUNT(primary_key) FROM ... WHERE... 
28

MySQL में:

SELECT SQL_CALC_FOUND_ROWS 
     * 
FROM posts p, images im, postimages pi 
WHERE i.active = 1 
     AND pi.post_id = p.id 
     AND pi.image_id = im.image_id 
ORDER BY 
     created_at 
LIMIT 16; 

SELECT FOUND_ROWS(); 

पहली क्वेरी 16 पंक्तियों वापस आ जाएगी, और दूसरी क्वेरी आप पंक्तियों जो वहाँ पहली क्वेरी में कोई LIMIT खंड हो लौटा दिया जाएगा की संख्या वापस आ जाएगी।

आप यह तय करने के लिए इसका उपयोग कर सकते हैं कि "अगला" लिंक दिखाना है या नहीं।

+0

क्या यह ओरेकल में ऐसा करने का एक समान तरीका है? – ria

+0

+1। MySQL docu भी देखें: [http://dev.mysql.com/doc/refman/5.6/en/information-functions.html#function_found-rows] – Wolfgang

+0

- @ Quassnoi, आप 1 और 2 दोनों के परिणामों को कैसे वापस कर सकते हैं प्रश्नों? मैं केवल 'FOUND_ROWS()' परिणाम देख सकता हूं। –

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