Этот вопрос является вариацией проблемы «наибольший n на группу», но вы ищете наименьшее, а не наибольшее, и ваши критерии находятся в таблице поиска (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
PS: Надеюсь, вы не возражаете, я добавил в ваш вопрос тег "great-n-per-group". Нажмите на этот тег, чтобы увидеть другие вопросы о SO, которые я пометил аналогично.