اذهب إلى المحتوى
  • 0

كيفية تطبيق مبدأ التصفيح pagination في SQL أي جلب عدد استعلامات محدد على شكل صفحات

سعيد يوسف

السؤال

Recommended Posts

  • 1

يوجد عدة طرق لتحقيق المطلوب وهذا يعتمد على نوع مخدم قاعدة البيانات وما يدعمه.

في SQL Server يوجد الكلمتين المفتاحيتين:

  •  OFFSET وتعني تطبيق إزاحة skip وتجاهل عدد من السجلات (نبدأ جلب السجلات التي رقمها من بعد قيمتها)
  • FETCH NEXT تفيد في تحديد عدد الأسطر التالية المطلوبة
SELECT col1, col2, -- تحديد الأعمدة
 FROM ...          -- تحديد الجدول
 WHERE ...         -- كتابة شرط الفلترة

 ORDER BY          -- يفضل وبشكل ضروري ترتيب البيانات حسب حقل معين ليتم جلبهم بطريقة صحيحة

-- الجزء التالي يحدد الإزاحة وعدد السجلات الذي سيعيده الاستعلام
OFFSET     10 ROWS       -- تخطي عشر سجلات 10 rows
FETCH NEXT 10 ROWS ONLY; -- جلب العشر سجلات التالية 10 rows

يمكن تعريف متغيرات وتمرير قيمة لها ثم استخدامها في الاستعلام

DECLARE @Skip  TINYINT = 10
      , @Fetch TINYINT = 10;

كما يمكن تطبيقها بواسطة ROW_NUMBER التي تعيد رقم السطر ضمن النتيجة وبهذا نقوم بفلترة النتائج

select *      -- جلب أعمدة
from
    (
      select *,
      ROW_NUMBER() OVER (ORDER BY columnid) AS ROW_NUM  -- جلب ترقيم النتائج بترتيب حسب المعرف
      from table_name
    ) table_x

WHERE             -- تحديد شرط الفلترة
    RowNum >= 10
AND RowNum <= 20

ORDER BY RowNum   -- إعادة ترتريب حسب رقم السطر 

وفي MySQL يمكن استخدام LIMIT + OFFSET

LIMIT + OFFSET
=>
SELECT column FROM table
LIMIT 10 OFFSET 10

LIMIT 2 params

=>
SELECT * FROM table 
LIMIT 10, 50        -- النتيجة هي الأسطر 11-60   

skip 10, take 50

تجاهل أول 10 أسطر
وجلب 50 سطر التالي

لجلب كل القيم بعد النتيجة 10، نضع الوسيط الثاني قيمة كبيرة جدا

SELECT * FROM tbl LIMIT 10,18446744073709551615;

وباستخدام المتغيرات

SET @skip=1; SET @numrows=5;

PREPARE STMT FROM 'SELECT * FROM tbl LIMIT ?, ?';
EXECUTE STMT USING @skip, @numrows;

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 1

بفرض لدينا جدول المستخدمين users التالي:

+----+-------+
| Id | Name  |
+----+-------+
|  1 | أحمد  | 
|  2 | عبدالله  |
|  3 | يوسف  |
|  4 | جمال  |
|  5 | محمد  |
|  6 | سعيد  |
+----+-------+

ونريد تصفح النتائج على صفحات كل صفحة فيها ثلاث أسطر، سيكون الجدول السابق عبارة عن صفحتين كل منها تحتوي ثلاث نتائج بالشكل التالي:

# الصفحة الأولى
+----+-------+
| Id | Name  |
+----+-------+
|  1 | أحمد  | 
|  2 | عبدالله  |
|  3 | يوسف  |
+----+-------+

# الصفحة الثانية
+----+-------+
| Id | Name  |
+----+-------+
|  4 | جمال  |
|  5 | محمد  |
|  6 | سعيد  |
+----+-------+

MYSQL

نستخدم الكلمتين:

  • LIMIT لتحديد عدد النتائج في الصفحة الواحدة (3 في حالتنا)
  • OFFSET  لتحديد رقم الصفحة يمكن تجاهلها للصفحة الأولى (1 أو 2 في حالتنا)

تكون الاستعلامات كالتالي:

# الصفحة الأولى
SELECT * FROM users LIMIT 3 OFFSET 1;

# أو
SELECT * FROM users LIMIT 3;


# الصفحة الثانية 
SELECT * FROM users LIMIT 3 OFFSET 2;

 SQL Server

نستخدم الجملتين

  • FETCH NEXT x ROWS ONLY لتحديد عدد النتائج في الصفحة الواحدة حيث x هو عدد النتائج (3 في حالتنا)

  • OFFSET x ROWS لتحديد بداية الصفحة، حيث x يشير إلى ترتيب أول نتيجة نريدها في الصفحة، يمكن حسابها بدليل الصفحة كالتالي (حجم الصفحة × (رقم الصفحة - 1))، يمكن تجاهلها لأول صفحة (0 و 3 في حالتنا)

تكون الاستعلامات كالتالي:

# الصفحة الأولى
SELECT * FROM users OFFSET 0 ROWS FETCH NEXT 3 ROWS ONLY;

# أو
SELECT * FROM users NEXT 3 ROWS ONLY;


# الصفحة الثانية 
SELECT * FROM users OFFSET 3 ROWS FETCH NEXT 3 ROWS ONLY;

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...