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

السؤال

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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...