إرجاع نتائج الاستعلام بترتيب محدد مسبقًا

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

  •  02-07-2019
  •  | 
  •  

سؤال

هل من الممكن عمل عبارة SELECT بترتيب محدد مسبقًا، على سبيل المثال.اختيار المعرفات 7،2،5،9 و 8 وإعادتهم بهذا الترتيب, ، بناءً على لا شيء أكثر من حقل المعرف؟

البيانات حدد المعرف من الجدول حيث المعرف في (7،2،5،9،8)؛وحدد المعرف من الجدول حيث المعرف (8،2،5،9،7)؛كلاهما يعيدهما بنفس الترتيب.

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

المحلول

لم أكن أعتقد أن هذا ممكن، ولكن وجدت دخول بلوق هنا يبدو أن هذا يفعل نوع الشيء الذي تبحث عنه:

SELECT id FROM table WHERE id in (7,2,5,9,8) 
ORDER BY FIND_IN_SET(id,"7,2,5,9,8");

سوف تعطي نتائج مختلفة ل

SELECT id FROM table WHERE id in (7,2,5,9,8) 
ORDER BY FIND_IN_SET(id,"8,2,5,9,7");

FIND_IN_SET إرجاع موقف id في الحجة الثانية المعطاة لها، لذلك بالنسبة للحالة الأولى أعلاه، id من 7 في الموضع 1 في المجموعة، 2 في 2 وهكذا - يعمل MySQL داخليًا على شيء من هذا القبيل

id | FIND_IN_SET
---|-----------
7  | 1
2  | 2
5  | 3

ثم يأمر بنتائج FIND_IN_SET.

نصائح أخرى

ORDER BY FIELD(ID,7,2,4,5,8) هو أفضل رهان لك، لكنه لا يزال قبيحًا.

هل يمكنك تضمين تعبير حالة يعين معرفاتك 7،2،5،...إلى الترتيبية 1،2،3، ...ومن ثم النظام بهذا التعبير؟

تتم جميع عمليات الترتيب من خلال الكلمات الرئيسية ORDER BY، ولكن يمكنك فقط الفرز تصاعديًا وتنازليًا.إذا كنت تستخدم لغة مثل PHP، فيمكنك فرزها وفقًا لذلك باستخدام بعض التعليمات البرمجية ولكني لا أعتقد أن ذلك ممكنًا باستخدام MySQL وحده.

هذا يعمل في أوراكل.هل يمكنك أن تفعل شيئا مماثلا في MySql؟

SELECT ID_FIELD
FROM SOME_TABLE
WHERE ID_FIELD IN(11,10,14,12,13)
ORDER BY
  CASE WHEN ID_FIELD = 11 THEN 0
       WHEN ID_FIELD = 10 THEN 1
       WHEN ID_FIELD = 14 THEN 2
       WHEN ID_FIELD = 12 THEN 3
       WHEN ID_FIELD = 13 THEN 4
  END

قد تحتاج إلى إنشاء جدول مؤقت يحتوي على حقل ترقيم تلقائي وإدراجه بالترتيب المطلوب.ثم قم بالفرز في حقل الرقم التلقائي الجديد.

ارم، ليس حقا.أقرب ما يمكنك الحصول عليه هو على الأرجح:

SELECT * FROM table WHERE id IN (3, 2, 1, 4) ORDER BY id=4, id=1, id=2, id=3

لكن ربما لا تريد ذلك :)

من الصعب أن نقدم لك أي نصيحة محددة دون مزيد من المعلومات حول ما هو موجود في الجداول.

إنه أمر مبتكر (وربما بطيء)، ولكن يمكنك الحصول على التأثير باستخدام UNION ALL:

SELECT id FROM table WHERE id = 7
UNION ALL SELECT id FROM table WHERE id = 2
UNION ALL SELECT id FROM table WHERE id = 5
UNION ALL SELECT id FROM table WHERE id = 9
UNION ALL SELECT id FROM table WHERE id = 8;

يحرر: ذكر أشخاص آخرون وظيفة find_in_set الموثقة هنا.

تحصل على الإجابات بسرعة هنا، أليس كذلك...

سبب طرحي لهذا السؤال هو أنها الطريقة الوحيدة التي يمكنني التفكير بها لتجنب فرز مصفوفة معقدة متعددة الأبعاد.أنا لا أقول أنه سيكون من الصعب الفرز، ولكن إذا كانت هناك طريقة أبسط للقيام بذلك باستخدام Straight SQL، فلماذا لا.

أحد حلول أوراكل هو:

SELECT id FROM table WHERE id in (7,2,5,9,8)
ORDER BY DECODE(id,7,1,2,2,5,3,9,4,8,5,6);

يؤدي هذا إلى تعيين رقم الطلب لكل معرف.يعمل بشكل جيد لمجموعة صغيرة من القيم.

أفضل ما يمكنني التفكير فيه هو إضافة ترتيب عمود ثانٍ:

7 1
2 2
5 3
9 4 
8 5

وبعد ذلك فقط قم بإجراء ORDER BY orderColumn

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top