选择不同的身份行基础上加入优先列的最低值
-
11-09-2019 - |
题
简化的表结构,所有INT列和标识列的外侧没有的PK:
<强>节点(n)的强>表:id
<强>属性(a)中强>表:id
,node_id
,type_id
<强>类型(T)强>表:id
,priority
我试图选择的一组属性,其中的每一个具有用于其相应节点的最低type.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
我首先想到的是使用聚合,MIN,但然后碰到问题匹配了最低优先级,用于与正确属性的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
PS:我希望你不介意,我添加了“最伟大的正每个组”标签,以你的问题。单击标签看到,我也有类似的标签上的其他问题。
其他提示
使用仲裁器的查询(未测试):
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
)
不隶属于 StackOverflow