اختيار صفوف الهوية المميزة بناء على أدنى قيمة عمود أولوية انضم

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

  •  11-09-2019
  •  | 
  •  

سؤال

هياكل الجدول المبسطة، كل الأعمدة الدولية وعدم وجود PKS خارج أعمدة الهوية:

العقد (ن) جدول: id

السمات (أ) جدول: id, node_id, type_id

النوع (ر) جدول: id, priority

أحاول اختيار مجموعة من السمات، كل منها لديه أدنى نوع. على الرغم من وجود سمات متعددة لكل node_id, ، أريد فقط تحديد واحد بأقل قيمة أولوية:

a1 n1 t1 p0 *
a2 n1 t2 p1 
a3 n2 t2 p1 *
a4 n2 t3 p2  

هذا هو الاستعلام الأساسي الذي أعمل منه، في هذه النقطة التي أتلقت أيضا عالق:

   SELECT * 
     FROM a 
LEFT JOIN t ON a.type_id = t.id 
 GROUP BY node_id

كان من الفكر الأول هو استخدام إجمالي، دقيقة، لكنني أتناول مشاكل مطابقة لأقل أولوية لعقد node_id مع السمة الصحيحة.

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

المحلول

هذا السؤال هو اختلاف لمشكلة "أعظم التنمية"، لكنك تبحث عن الأقل بدلا من الأعظم، ومعاييرك في جدول بحث (Type) بدلا من جدول المبدأ (Attributes).

لذلك تريد الصفوف (a1) من Attributes بحيث لا يوجد صف آخر مع نفسه node_id يرتبط بأولوية أقل.

SELECT a1.*
FROM Attributes a1 INNER JOIN Type t1 ON (a1.type_id = t1.id)
LEFT OUTER JOIN (
  (Attributes a2 INNER JOIN Type t2 ON (a2.type_id = t2.id))
  ON (a1.node_id = a2.node_id AND t1.priority > t2.priority)
WHERE a2.node_id IS NULL;

لاحظ أن هذا يمكن أن يؤدي إلى العلاقات. لم تقم بتوصيف كيفية حل العلاقات إذا تمت الإشارة إلى سمات نوعين مع نفس الأولوية. بمعنى آخر، في الأمثلة التالية، التي يجب اختيار السمات؟

a1 n1 t1 p0 
a2 n1 t1 p0 
a3 n2 t2 p1 
a4 n2 t3 p1 

ملاحظة: آمل أن لا تمانع في إضافة علامة "أعظم N-Per-group" لسؤالك. انقر فوق هذه العلامة لمشاهدة أسئلة أخرى بحيث قمت بالمعلم بالمشابه.

نصائح أخرى

استخدام استعلام التعادل الكسري (غير اختبار):

SELECT      n.*, a.*
FROM        Nodes n
LEFT JOIN   Attributes a
        ON  a.id = (SELECT      x.id --//TOP 1 x.id
                    FROM        Attributes x
                    INNER JOIN  Type t
                            ON  x.type_id = t.id
                    WHERE       x.node_id = n.id
                    ORDER BY    t.priority ASC,
                                --//just in case there are 2 attributes 
                                --//with the same priority, order also on x.id
                                x.id ASC
                    LIMIT 1
                    )
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top