2011-02-07 14 views
5

मैं, किसी तालिका में अभिलेखों की संख्या गिनती करने के लिए, तब भी जब SQL विवरण इसे में एक LIMIT है कोशिश कर रहा हूँ समग्र यह काम करता है लेकिन कुछ अजीब होता है कोड के रूप में:एक सीमा के साथ MySQL रिकॉर्ड गिनती

$sql = "SELECT COUNT(*) AS count FROM posts 
     ORDER BY post_date DESC 
     LIMIT 5"; 

// ... mysql_query, etc 

while($row = mysql_fetch_array($result)) 
{ 
    // ... HTML elements, etc 
    echo $row['post_title']; 

    // ... HTML elements, etc 

    echo $row['count']; // this displays the number of posts (which shows "12"). 
} 

हालांकि, जब while लूप के माध्यम से प्रदर्शित, यह इस प्रदर्शित करता है:

नोटिस: अपरिभाषित सूचकांक: लाइन पर /Applications/MAMP/htdocs/blog/index.php में POST_TITLE 55

यदि मैं COUNT(*) AS count हटा देता हूं, तो सब कुछ पूरी तरह से प्रदर्शित होगा ... यह कैसा चल रहा है?

+2

के बीच एक संख्या देता है आप एक चयन क्वेरी को सीमित क्यों कर रहे हैं जो केवल 1 परिणाम देता है? – UnkwnTech

+0

मुझे यकीन है कि '$ count = 5; 'आपको अधिकतर समय लगेगा। –

+0

मुझे लगता है कि आप ठीक से नहीं पढ़ रहे थे ... – MacMac

उत्तर

15

पंक्तियों की संख्या (कई कारणों से) की गणना करने के लिए COUNT(*) का उपयोग न करें। अपनी पूरी क्वेरी लिखें, और जोड़ने SQL_CALC_FOUND_ROWS सही SELECT के बाद:

SELECT SQL_CALC_FOUND_ROWS id, title FROM foo LIMIT 5; 

फिर, के बाद कि क्वेरी निष्पादित (सही होने के बाद), चलाएँ:

SELECT FOUND_ROWS(); 

कि पंक्तियों मूल SELECT की संख्या वापस आ जाएगी अगर आपके पास अंत में LIMIT नहीं था (सभी जोड़ों और कहां खंडों के लिए लेखांकन) पर वापस आ गया होगा।

यह पोर्टेबल नहीं है, लेकिन यह बहुत ही कुशल है (और इस प्रकार की समस्या को संभालने का सही तरीका IMHO)।

+1

+1, कुछ नया सीखा :) – JohnB

+1

+1 सही जवाब है। –

+0

(नोट: पोर्टेबल नहीं है इसका मतलब है कि आप इसे अन्य डेटाबेस पर उपयोग नहीं कर सकते हैं। @ जॉनबी का जवाब व्यावहारिक रूप से किसी भी संबंधपरक डेटाबेस पर कैसे करें) –

0

आप SELECT कथन केवल COUNT(*) AS count लौटने के लिए कह रहे हैं। यदि आप अधिक कॉलम लौटा चाहते हैं, तो आपको उन्हें SELECT कथन में निर्दिष्ट करना होगा।

+0

ओपी के मामले में ऐसा करने से एक ही टेबल का प्रतिनिधित्व होगा 5 पंक्तियों के लिए कॉलम मान के रूप में पंक्ति गणना। परिणाम समूह द्वारा ग्रुप के बिना थोड़ा समझ में आता है। यह दो प्रश्न होना चाहिए। गिनती पाने के लिए, डेटा प्राप्त करने के लिए एक। सरल और आसान। –

1

LIMIT यहां कुछ भी नहीं करता है क्योंकि आप एक स्केलर चुन रहे हैं। त्रुटि दिखायी गई है क्योंकि आप पोस्ट शीर्षक का चयन नहीं कर रहे हैं, इसलिए यह $row हैश में नहीं है।

0

COUNT(*) AS count सहित आपने उन वास्तविक कॉलम को हटा दिया है जिन्हें आप जानकारी प्राप्त करना चाहते हैं।

SELECT *, COUNT(*) AS count FROM posts ORDER BY post_date DESC LIMIT 5 

कि क्वेरी का उपयोग कर दोनों चीजें आप एक क्वेरी में करने के लिए कोशिश कर रहे हैं पूरा होगा की कोशिश करो, लेकिन वास्तव में, इन 2 अलग-अलग क्वेरी में विभाजित किया जाना चाहिए। क्वेरी में COUNT रखने का समग्र उद्देश्य क्या है? यह एक अलग तरीका किया जाना चाहिए।

+1

यह वास्तव में एक अच्छा जवाब नहीं है। आप जानकारी के गन्दा मिश्रण को वापस पाने जा रहे हैं - प्रत्येक पंक्ति के लिए मूल्य के रूप में आपकी तालिका में पंक्तियों की कुल गणना। आपको इसे दो प्रश्नों में करना चाहिए। –

+0

@ माइक (और दूसरा लड़का जिसने इस जवाब को कम वोट दिया): मिच 'चयन *, COUNT (*)' करने की सिफारिश नहीं कर रहा है, वह बस यह स्पष्ट करने की कोशिश कर रहा था कि ओपी केवल एक प्रश्न में क्या करने की कोशिश कर रहा था, 2 के बजाय, जो निश्चित रूप से अधिक समझ में आता है। मिच का कहना है कि उसके जवाब के नीचे। +1 मिच – JohnB

+0

मुझे लगता है कि यदि आप पैडेंटिक बनना चाहते हैं, तो यह ओपी प्रश्न का उत्तर देता है, लेकिन जाहिर है कि "सर्वश्रेष्ठ" उत्तर वह प्रश्न होना चाहिए जो प्रश्न का उत्तर दे और ओपी को "सही" चीज़ करने के लिए मार्गदर्शन करे ... @Mitch वास्तव में एक "आसान" तरीका दें, जबकि अन्य पोस्ट (@ircmaxell, @nalroff) किया। I -1 और ओपी को सही काम करने के बारे में दो बार सोचने के लिए प्रोत्साहित करने के लिए "सर्वोत्तम" उत्तरों को +1 करें (उम्मीद है कि ओपी किसी अन्य दिन कुल कार्यों के बारे में और जानेंगे) –

1

ऐसा इसलिए हो रहा है क्योंकि COUNT() एक समग्र कार्य है। तालिका में पंक्तियों की गणना और अलग-अलग रिकॉर्ड प्राप्त करने के लिए आपको दो अलग-अलग प्रश्न पूछना होगा।

0

आप एक मानक चयन के साथ एक समग्र समारोह COUNT() मिश्रण कर रहे हैं। आपको अपनी कुल क्वेरी में ग्रुप बाय क्लॉज के बिना सटीक पोस्ट शीर्षक नहीं मिल सकता है। सबसे आसान बात यह है कि आपको यह दो प्रश्न करना है - आपकी गिनती के लिए, दूसरा आपकी पोस्ट जानकारी के लिए। साथ ही, कुल मिलाकर LIMIT का उपयोग करने में कोई समझ नहीं है, जिसमें आपके (छोड़े गए) GROUP BY में कोई अन्य कॉलम नहीं है - वर्तमान क्वेरी हमेशा एक पंक्ति लौटाएगी।

1

हर कोई क्या कहने की कोशिश कर रहा है कि आपको 1 सिंगल के बजाय 2 अलग-अलग प्रश्नों का उपयोग करना चुनना चाहिए।

1) तालिका के पंक्ति संख्या प्राप्त

$sql = "SELECT COUNT(*) AS count FROM posts; 

2)

$sql = "SELECT * FROM posts 
     ORDER BY post_date DESC 
     LIMIT 5"; 
0

मैं एक ही समस्या थी तालिका के अंतिम 5 पंक्तियाँ हो और इस लेख पाया: http://www.mysqldiary.com/limited-select-count/ सबसे अच्छा तरीका है (विशेष रूप से बड़ी टेबल के लिए) इसका उपयोग इस प्रकार कर रहा है:

SELECT COUNT(*) AS count FROM (SELECT 1 FROM posts 
    ORDER BY post_date DESC 
    LIMIT 5) t 

अब यह 0 और 5

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

  • कोई संबंधित समस्या नहीं^_^