MySQL: أحتاج إلى الحصول على إزاحة عنصر في استعلام

StackOverflow https://stackoverflow.com/questions/2566620

  •  24-09-2019
  •  | 
  •  

سؤال

MySQL: أحتاج إلى الحصول على إزاحة عنصر في استعلام.

لديّ معرض صور: هذا العرض 6 صورة لكل مكدس ، لذلك عندما أطلب الصورة 22 ، فإنها تعرض الصور من 18 إلى 24. يجب أن تحصل أولاً على إزاحة الصورة 22 ، ثم الحصول على الصور من 18 إلى 24.

مثال آخر: أطلب رقم الصورة 62 (وإزاحة 62) ، وسيختار الصور مع إزاحة من 60 إلى 66.

هل ممكن مع استفسار واحد؟

الشيء المهم الرئيسي هو الحصول على قيمة الإزاحة للعنصر الذي يحتوي على معرفه مساوٍ للرقم.

شكرًا ؛)

تعديل:حدد * من الصور order_by updated_at الإزاحة (هنا أحتاج إلى الحصول على إزاحة معرف الصورة في هذا الاستعلام ، وجعل بعض الحسابات ... هذا ما أحتاجه ، إذا كان ذلك ممكنًا ..: D)

EDIT2:الآن أفهم أنني بحاجة إلى استفسارين:

1º: احصل على إزاحة الصورة داخل الاستعلام بترتيب مخصص

2º: احصل على الصور باستخدام الإزاحة من الاستعلام الأول ... هذا يمكنني أن أجعله وحدي ، أول مشكلة ..: S

هل كانت مفيدة؟

المحلول

إذا كانت صورك تحتوي على معرفات متسلسلة ، فقد ترغب في القيام بما يلي:

SELECT    * 
FROM      images 
WHERE     id >= ((? DIV 6) * 6) AND 
          id < (((? DIV 6) + 1) * 6)
ORDER BY  id;

استبدال ? المعلمة في الاستعلام أعلاه مع معرف الصورة المطلوبة.


تحديث: يبدو أن صورك لا يتم طلبها بواسطة معرف متسلسل ، ولكن بواسطة الطابع الزمني. لسوء الحظ ، يبدو أن MySQL لا يدعم التعبيرات المتغيرة في LIMIT بند (مصدر). خيار واحد هو استخدام بيان معد:

PREPARE stmt FROM 
" SELECT    * 
  FROM      images
  ORDER BY  updated_at
  LIMIT     ?, 6";

SET @lower_limit := ((22 DIV 6) * 6);

EXECUTE stmt USING @lower_limit;

يمكن أن يكون هناك خيار آخر:

SET @row = 0;

SELECT    * 
FROM      images 
WHERE     (@row := @row + 1) BETWEEN ((3 DIV 6) * 6) + 1 and (((3 DIV 6) + 1) * 6)
ORDER BY  updated_at;

نصائح أخرى

تعديل: يبدو أن MySQL لا يسمح بهذا النوع من التعبير في جملة الإزاحة. إذا كان يمكنك استخدام عبارة معدّة (إما مباشرة في SQL أو بلغة أخرى) ، فيمكنك إجراء الحساب مسبقًا واستخدامه. يرى دانيالإجابة لذلك. سأترك هذه الإجابة هنا بسبب المعلومات المفيدة الأخرى.

ما تبحث عنه يسمى ترقيم الصفحات. في MySQL يمكنك القيام بذلك مع LIMIT و OFFSET الكلمات الدالة:

SELECT   image
FROM     images
ORDER BY updated_at
LIMIT    6
OFFSET   (DIV(?, 6) * 6)

يحل محل ? مع فهرس الصورة المطلوب. لاحظ أن هذا سيعطي صورًا مع إزاحة 60 ، 61 ، 62 ، 63 ، 64 ، 65 عندما تطلب الصورة 62. افترضت أن آخر إزاحة أعطيتها في الأمثلة كانت حصرية. يجب عليك ضبط وفقًا لذلك إذا قمت بالافتراض الخاطئ.

وتفسير صغير:

LIMIT يجعل الاستعلام يعيد فقط العدد المعطى من النتائج. لأنك تريد دائمًا ستة ، وهذا يجعل الأمر سهلاً.

OFFSET يجعل عودة الاستعلام ينتج فقط عن الإزاحة المحددة. الحساب لا تقسيم عدد صحيح بستة ويضاعف بستة. ينتج عن هذا المضاعف السابق ستة من الرقم المحدد ، بالضبط ما تريد.

قد لا أفهمك ، لكن لماذا عليك أن تفعل كل شيء في MySQL؟

لنفترض أنك تستخدم المصباح:

$pagination_start = (int)(floor($id_requested / 6)*6);
$offset_array = ($id_requested % 6);
$offset_mysql = $pagination_start + $offset_array;

الآن لديك بدء ترقيم الصفحات في $pagination_start أي 60] وطلب إزاحة الصورة [أي 62] في $offset_mysql:

SELECT   image
FROM     images
ORDER BY updated_at DESC
LIMIT    $pagination_start, 6

الآن في المقابل ، يمكنك الحصول على 6 صور Cotaning 6 والطلب المطلوب هو في $result[$offset_array].

SELECT   image
FROM     images
ORDER BY updated_at
LIMIT    6, FLOOR($number / 6 ) * 6;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top