قائمة
بدون مقابل
التسجيل
الصفحة الرئيسية  /  على/ كيف نحسب كل الصفوف في mysql. تحديد وإحصاء الصفوف في استعلام واحد - SQL_CALC_FOUND_ROWS

كيف نحسب كل الصفوف في MySQL. تحديد وإحصاء الصفوف في استعلام واحد - SQL_CALC_FOUND_ROWS

بدءًا من الإصدار 4.0 ، يتوفر MySQL DBMS فرصة مناسبةحساب عدد جميع السجلات المطابقة للاستعلام عندما يكون عدد السجلات محدودًا بـ LIMIT. عند العمل مع البحث في قاعدة البيانات ، وكذلك عند الاختيار من بين الجداول ذات الامتداد كمية كبيرةالسجلات ، فهذه الوظيفة ضرورية ببساطة.

بناء الجملة. في استعلام SELECT ، يجب أن تكون قائمة الأعمدة مسبوقة بخيار SQL_CALC_FOUND_ROWS. هنا بداية وصف بناء جملة بناء SELECT.

تحديد




select_expr ،… ...

وهكذا تفعل حدد الاستعلام SQL_CALC_FOUND_ROWS سيقوم DBMS بحساب العدد الإجمالي للصفوف التي تطابق شرط الاستعلام وتخزين هذا الرقم في الذاكرة. بطبيعة الحال ، فإن الاستعلام SELECT SQL_CALC_FOUND_ROWS يكون منطقيًا فقط عند استخدام حد (LIMIT). مباشرة بعد تنفيذ استعلام التحديد ، للحصول على عدد السجلات ، تحتاج إلى تنفيذ استعلام SELECT آخر: SELECT FOUND_ROWS () ؛. نتيجة لذلك ، ستعيد MySQL صفًا واحدًا بحقل واحد ، والذي سيخزن عدد الصفوف.

مثال على الطلبات نفسها:

> حدد SQL_CALC_FOUND_ROWS * من tbl_name حيث الرقم> 100 حد 10 ؛
> تحديد FOUND_ROWS () ،

سيعيد الاستعلام الأول (عرض) 10 صفوف من جدول tbl_name حيث يكون رقم الشرط> 100 صحيحًا. وسيعيد الاستدعاء الثاني لأمر SELECT عدد الصفوف التي كان من الممكن أن يُرجعها أمر SELECT الأول إذا تمت كتابته بدون بيان محدد. على الرغم من أن MySQL يجب أن تعيد حساب جميع الصفوف في مجموعة النتائج عند استخدام الأمر SELECT SQL_CALC_FOUND_ROWS ، إلا أن هذه الطريقة لا تزال أسرع من دون LIMIT لأنها لا تحتاج إلى إرسال النتيجة إلى العميل.

طلبات أمثلة من PHP:

نتيجة $ = mysql_query ("SELECT SQL_CALC_FOUND_ROWS * FROM table1 LIMIT 0، 10"، $ link)؛
while ($ row = mysql_fetch_assoc ($ result))
{
var_dump ($ row) ،
}

نتيجة $ = mysql_query ("SELECT FOUND_ROWS ()"، $ link)؛
num_rows = mysql_result ($ نتيجة، 0)؛
صدى "$ num_rows Rows \ n"؛

كنتيجة لتنفيذ الكود ، بشرط أن يشير $ link إلى اتصال مفتوح بنظام DBMS ، فإن PHP ستطبع 10 صفوف من جدول الجدول 1 ، ثم قيمة عدد صحيح لعدد الصفوف التي تطابق الاستعلام (باستثناء LIMIT).

في استعلامات UNION ، يمكن لـ SQL_CALC_FOUND_ROWS التصرف بطريقتين نظرًا لحقيقة أن LIMIT يمكن أن تظهر في أماكن متعددة. يمكن إجراء عد الصف لاستعلامات SELECT الفردية ، أو للاستعلام بأكمله بعد الصلة.

الغرض من SQL_CALC_FOUND_ROWS لـ UNION هو أنه يجب أن يُرجع عدد الصفوف التي سيتم إرجاعها بدون LIMIT عام. شروط استخدام SQL_CALC_FOUND_ROWS مع UNION مذكورة أدناه:

  • يجب تحديد الكلمة الأساسية SQL_CALC_FOUND_ROWS في أول جملة SELECT.
  • ستكون قيمة FOUND_ROWS () دقيقة فقط إذا تم استخدام UNION ALL. إذا تم تحديد UNION بدون ALL ، فسيتم حذف التكرارات ويكون FOUND_ROWS () تقريبيًا فقط.
  • إذا لم يكن هناك LIMIT في UNION ، فسيتم تجاهل SQL_CALC_FOUND_ROWS ويتم إرجاع عدد الصفوف في الجدول المؤقت الذي تم إنشاؤه لتنفيذ UNION.
دعونا نتذكر ما هي الرسائل والموضوعات التي لدينا. للقيام بذلك ، يمكنك استخدام الاستعلام المعتاد:

ولكن ماذا لو أردنا فقط معرفة عدد الرسائل الموجودة في المنتدى. للقيام بذلك ، يمكنك استخدام الوظيفة المضمنة عدد(). تحسب هذه الوظيفة عدد الأسطر. علاوة على ذلك ، إذا تم استخدام * كوسيطة لهذه الوظيفة ، فسيتم حساب جميع صفوف الجدول. وإذا تم تحديد اسم العمود كوسيطة ، فسيتم حساب الصفوف التي لها قيمة في العمود المحدد فقط.

في مثالنا ، ستعطي كلتا الوسيطتين نفس النتيجة ، منذ ذلك الحين جميع أعمدة الجدول من النوع NOT NULL. لنكتب استعلامًا باستخدام العمود id_topic كوسيطة:

حدد COUNT (id_topic) من المشاركات ؛

لذلك ، في مواضيعنا هناك 4 رسائل. ولكن ماذا لو أردنا معرفة عدد المشاركات الموجودة في كل موضوع. للقيام بذلك ، نحتاج إلى تجميع رسائلنا حسب الموضوع وحساب عدد الرسائل لكل مجموعة. للتجميع في SQL ، يتم استخدام عامل التشغيل مجموعة من. سيبدو طلبنا الآن كما يلي:

حدد id_topic ، COUNT (id_topic) من المشاركات GROUP BY id_topic ؛

المشغل أو العامل مجموعة منيخبر نظام إدارة قواعد البيانات (DBMS) بتجميع البيانات حسب عمود id_topic (أي أن كل موضوع يمثل مجموعة منفصلة) ويحسب عدد الصفوف لكل مجموعة:

حسنًا ، في الموضوع الذي يحتوي على معرف = 1 لدينا 3 رسائل ، ومع معرف = 4 - واحد. بالمناسبة ، إذا كان هناك غياب محتمل للقيم في الحقل id_topic ، فسيتم دمج هذه الصفوف في مجموعة منفصلة بقيمة NULL.

افترض أننا مهتمون فقط بالمجموعات التي تحتوي على أكثر من رسالتين. في الاستعلام العادي ، نحدد الشرط باستخدام عامل التشغيل أين، ولكن هذا المشغل يمكنه العمل فقط مع السلاسل ، وبالنسبة للمجموعات ، يتم تنفيذ نفس الوظائف بواسطة المشغل نأخذ:

حدد id_topic، COUNT (id_topic) من التدوينات GROUP BY id_topic HAVING COUNT (id_topic)> 2 ؛

نتيجة لذلك ، لدينا:

في الدرس 4 ، نظرنا إلى الشروط التي يمكن أن يحددها المشغل أين، يمكن تحديد نفس الشروط من قبل المشغل نأخذ، عليك فقط أن تتذكر ذلك أينفلاتر الصفوف و نأخذ- مجموعات.

لذلك تعلمنا اليوم كيفية إنشاء مجموعات وكيفية حساب عدد الصفوف في جدول وفي مجموعات. بشكل عام ، جنبا إلى جنب مع المشغل مجموعة منيمكنك استخدام وظائف مضمنة أخرى ، لكننا سنقوم بدراستها لاحقًا.

لتحديد عدد السجلات في جدول MySQL ، تحتاج إلى استخدام وظيفة COUNT () الخاصة.

ترجع الدالة COUNT () عدد السجلات في جدول يتوافق مع المعايير المحددة.

تحسب الدالة COUNT (expr) دائمًا الصفوف فقط حيث يتم تقييم expr إلى NOT NULL.

استثناء لهذه القاعدة هو استخدام الدالة COUNT () مع علامة النجمة كوسيطة - COUNT (*). في هذه الحالة ، يتم حساب كل الصفوف ، بغض النظر عما إذا كانت فارغة أم لا.

على سبيل المثال ، ترجع الدالة COUNT (*) العدد الإجمالي للسجلات في جدول:

حدد عددًا (*) من table_name

كيفية حساب عدد السجلات وعرضها

مثال على كود PHP + MySQL لحساب وعرض العدد الإجمالي للصفوف:

$ res = mysql_query ("SELECT COUNT (*) FROM table_name") $ row = mysql_fetch_row ($ res)؛ إجمالي $ = $ row؛ // إجمالي السجلات echo $ total؛ ؟>

يوضح هذا المثال أبسط استخدام للدالة COUNT (). ولكن مع هذه الوظيفة ، يمكنك أداء مهام أخرى.

بالنظر إلى عمود جدول معين كمعلمة ، ترجع الدالة COUNT (اسم_العمود) عدد السجلات في هذا العمود التي لا تحتوي على قيمة فارغة. يتم تجاهل الإدخالات ذات القيم الخالية.

حدد COUNT (اسم_عمود) من اسم_الجدول

لا يمكنك استخدام دالة mysql_num_rows () ، لأنه من أجل معرفة العدد الإجمالي للسجلات ، تحتاج إلى تنفيذ SELECT * من استعلام db ، أي الحصول على جميع السجلات ، وهو أمر غير مرغوب فيه ، لذلك يفضل استخدم وظيفة العد.

نتيجة $ = mysql_query ("SELECT COUNT (*) كـ rec FROM db") ؛

استخدام الدالة COUNT () مع مثال

فيما يلي مثال آخر على استخدام وظيفة COUNT (). لنفترض أن هناك جدول ice_cream به كتالوج آيس كريم يحتوي على معرّفات الفئات وأسماء الآيس كريم.

بمجرد أن واجهت هذه المشكلة ، لكن العديد من الحلول المقدمة على الإنترنت لم تنجح معي. ومع ذلك وجدت طريقة. ولا حتى واحدة.

الطريقة الأولى: phpMyAdmin

لنبدأ بالأبسط والأكثر وضوحًا. لنفترض أنك لست بحاجة إلى استخدام النتيجة في الكود ، ولكن ببساطة اكتشف عدد الأسطر ، هذا كل شيء.

ثم نذهب إلى phpMyAdmin (localhost / tools / phpmyadmin - for Denver) ، ثم نختار قاعدة البيانات المطلوبة ، ثم نختار الجدول الذي يجب تحديد عدد الصفوف فيه ، ونرى الرسالة التالية:

الطريقة 2. العد

هذا ما يبدو عليه استعلام SQL نفسه:

استعلام SQL بشرط:

التنفيذ في PHP:

وبالمثل ، يمكن إضافة شرط هنا. ثم سيعرض الرمز عدد الصفوف في الجدول التي تفي بالشرط.

الطريقة الثالثة. mysql_num_rows

على سبيل المثال ، في WordPress ، يتم تخزين المنشورات في جدول wp_posts ، حتى نتمكن من معرفة عدد المنشورات (المنشورات) المخزنة في قاعدة البيانات (في جدول MySQL). هذا الرمز هو مجرد مثال (أو للحالات التي لا يتم فيها تحميل WordPress) لأن WordPress يتصل بقاعدة البيانات من خلال ملف.

ستشمل النتيجة تمامًا جميع السجلات. وكيف يمكن معرفة عدد ما يتم نشره فقط؟ للقيام بذلك ، نحتاج إلى تعديل استعلام SQL بشكل طفيف.