مشكلة مع ترتيب MySQL بواسطة - هل يمكنني استخدام Natsort لإصلاحه؟
سؤال
أحتاج إلى استخدام الفرز الطبيعي مع نتيجة MySQL لأنه يقوم حاليًا بفرز قيم int الخاصة بي على النحو التالي:
- 1
- 123
- 1256
- 22
- 231
إلخ
بينما سأحتاج إلى فرز مثل
- 1
- 22
- 231
- 1256
أعرف وظيفة "Natsort" ، لكنها لا تعمل مع نتيجة استعلام MySQL. كيف يمكنني الفرز (بشكل طبيعي) ، هل من الممكن القيام بذلك في الاستعلام؟
شكرا للمساعدة!
تحرير: مثال استعلام $result = mysql_query("SELECT * FROM forums ORDER BY 'posts' DESC;");
لست متأكدًا تمامًا مما إذا كان استخدامي لـ DESC يكون صحيحًا ، لكنه لا يرمي خطأ لذلك يجب أن يكون جيدًا. لسوء الحظ ، يبدو أن تغيير DESC إلى ASC ليس له أي تأثير ...
المحلول
الاستعلام الذي نشرته هناك هو فرز عن طريق تعبير سلسلة ثابتة ، بدلاً من اسم العمود أو موضعه. إما استخدام backticks للاقتباس ، أو إخراج الاقتباسات:
SELECT * FROM forums ORDER BY `posts` DESC
أو ربما
SELECT * FROM forums ORDER BY posts DESC
من شأنه أن يفسر لماذا التغيير بين ASC و DESC ليس له أي تأثير.
كان الجواب الأولي:
يشير ترتيب الفرز الذي تصفه إلى أن قيم int يتم تخزينها بالفعل كنوع حرف (أو ربما يتم تحويلها إلى حرف قبل الفرز).
تحقق مما إذا كنت تقوم بتخزين البيانات في نوع الرقم أو الحرف. إذا أمكن ، استخدم نوعًا رقميًا ، فسيكون ترتيب الفرز الطبيعي كما تحتاج. اذا أنت لا يمكن قم بتغيير نوع البيانات الأساسي ليكون INT ، ثم يمكنك القيام بذلك في استعلامك (على سبيل المثال باستخدام يقذف) ، ربما بتكلفة الأداء.
نصائح أخرى
إذا كانت المنشورات عمودًا غير INT ، فيمكنك تجربة هذا:
SELECT * FROM forums ORDER BY CAST(`posts` AS INT) DESC
إلقاء نظرة أيضًا على http://drupal.org/project/natsort. هذه وحدة Drupal يمكن استخدامها لتسهيل فرز MySQL.
هذا السؤال لديه إجابة لـ MySQL التي استخدمتها.