اختيار صفوف الهوية المميزة بناء على أدنى قيمة عمود أولوية انضم
-
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
)