كيف يمكنني التعامل مع العلاقات عندما يؤدي الترتيب إلى MySQL؟

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

سؤال

كيف يمكن لعلاقات المعالجة عندما يؤدي الترتيب إلى استعلام MySQL؟ لقد قمت بتبسيط أسماء الجدول والأعمدة في هذا المثال ، لكن يجب أن توضح مشكلتي:

SET @rank=0;

   SELECT student_names.students, 
          @rank := @rank +1 AS rank, 
          scores.grades
     FROM student_names  
LEFT JOIN scores ON student_names.students = scores.students
 ORDER BY scores.grades DESC

لذا تخيل أن الاستعلام أعلاه ينتج:

Students  Rank  Grades
=======================
Al         1     90
Amy        2     90
George     3     78
Bob        4     73
Mary       5     NULL
William    6     NULL

على الرغم من أن AL و Amy لهما نفس الدرجة ، إلا أن أحدهما أعلى من الآخر. حصلت إيمي على انفصال. كيف يمكنني أن أجعله حتى يحصل إيمي و آل على نفس الترتيب ، بحيث يكون لهما رتبة 1. أيضًا ، لم يختبر ويليام وماري الاختبار. لقد حصلوا على الفصل وكانوا يدخنون في غرفة الصبي. يجب أن تكون مرتبطة بالمكان الأخير.

يجب أن يكون الترتيب الصحيح:

Students  Rank  Grades
========================
Al         1     90
Amy        1     90
George     2     78
Bob        3     73
Mary       4     NULL
William    4     NULL

إذا كان لدى أي شخص أي نصيحة ، فيرجى إبلاغي بذلك.

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

المحلول

تعديل: هذا هو mysql 4.1+ مدعوم

يستخدم:

   SELECT st.name,
          sc.grades,
          CASE 
            WHEN @grade = COALESCE(sc.grades, 0) THEN @rownum 
            ELSE @rownum := @rownum + 1 
          END AS rank,
          @grade := COALESCE(sc.grades, 0)
     FROM STUDENTS st
LEFT JOIN SCORES sc ON sc.student_id = st.id
     JOIN (SELECT @rownum := 0, @grade := NULL) r
 ORDER BY sc.grades DESC

يمكنك استخدام صليب انضمام (في MySQL ، انضمام داخلي دون أي معايير) لإعلان واستخدام متغير دون استخدام منفصل SET بيان.

أنت بحاجة إلى coalesce للتعامل بشكل صحيح مع الفارغ.

نصائح أخرى

يبدو وكأنه قاعدة الوسيطة التي سيتم التعبير عنها بشكل أفضل في التعليمات البرمجية التي جلس بين قاعدة البيانات والعميل.

إذا لم يكن ذلك ممكنًا ، فإنني أوصي بإجراء تخزين في MySQL لتشغيل الاستعلام كما كتبته ثم تعديل النتائج باستخدام المؤشر ومصفوفة.

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