MySQL: أحتاج إلى الحصول على إزاحة عنصر في استعلام
سؤال
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;