数据库
首页 > 数据库> > sql-根据联接的优先级列的最小值选择不同的标识行

sql-根据联接的优先级列的最小值选择不同的标识行

作者:互联网

简化的表结构,所有INT列以及标识列之外没有PK:

节点数(n)表:id

属性(a)表:id,node_id,type_id

类型(t)表格:ID,优先级

我试图选择一组属性,每个属性对其各自的节点具有最低的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匹配最低优先级.

解决方法:

这个问题是“最大的每组最大”问题的一种变体,但是您要寻找的是最小的而不是最大的,并且您的条件在查找表(类型)而不是原理表(属性)中.

因此,您希望属性中的行(a1)不会使其他具有相同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:希望您不要介意我在您的问题中添加了“ greatest-n-per-group”标签.单击该标签可查看我也已类似标记的其他问题.

标签:greatest-n-per-group,sql,mysql
来源: https://codeday.me/bug/20191107/2002839.html