mysql - SQL:根据条件递归获取所有关系

标签 mysql sql

假设我们有以下两个表:

主表

id | number
1  | 5
2  | 3
3  | 4
4  | 5

数据透视表

primary | secondary
1       | 2
2       | 3
3       | 4

在数据透视表中,我定义了主表元素之间的多对多关系。

让我们将目标号码设置为 10。 现在我想递归地获取所有关系组合,但只有当所有相关元素的“数字”列的总和小于所需数字“10”时。

所以首先我们得到没有任何相关元素的所有元素:

1: 5
2: 3
3: 4
4: 5

因为没有元素具有“10”或更多,所以我想获得第一级关系。所以:

1-2: 8 // Sum of both elements
2-3: 7
3-4: 9

如您所见,我也不想要 2-1 的组合,因为我们已经有了 1-2。 没有“10”或更多的组合,所以获得下一个级别:

1-2-3: 12 // result because 12 is greater than 10
2-3-4: 12 // also a possible result

作为结果,我想要所有必要的元素 ID。 感谢您的帮助。

PS:我刚开始在 stackoverflow 上写问题,所以请原谅我糟糕的文本格式。

最佳答案

如果您将条目限制为 pivot这样primary < secondary你可以避免重复。这是执行前 4 个级别的第一遍。由于模式是可预测的,因此应该可以有一个循环,为循环中每个增加的级别构建查询字符串,然后动态地执行它。当第一个查询返回行时它将退出。

-- Level 1
select * from t1_main t where number > 10

-- Level 2
select p.pri, p.sec, m1.number + m2.number
from t1_pivot p 
inner join t1_main m1 on m1.id = p.pri 
inner join t1_main m2 on m2.id = p.sec
where m1.number + m2.number > 10

-- Level 3
select p1.pri, p1.sec, p2.sec, m1.number + m2.number + m3.number 
from t1_pivot p1 
inner join t1_pivot p2 on p1.sec = p2.pri
inner join t1_main m1 on m1.id = p1.pri 
inner join t1_main m2 on m2.id = p1.sec
inner join t1_main m3 on m3.id = p2.sec
where m1.number + m2.number + m3.number > 10

-- Level 4
select p1.pri, p1.sec, p2.sec, p3.sec, m1.number + m2.number + m3.number + m4.number
from t1_pivot p1 
inner join t1_pivot p2 on p1.sec = p2.pri 
inner join t1_pivot p3 on p2.sec = p3.pri
inner join t1_main m1 on m1.id = p1.pri 
inner join t1_main m2 on m2.id = p1.sec
inner join t1_main m3 on m3.id = p2.sec
inner join t1_main m4 on m4.id = p3.sec
where m1.number + m2.number + m3.number + m4.number > 10

关于mysql - SQL:根据条件递归获取所有关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37314570/

相关文章:

mysql - 在带有 group by 的 where 子句中使用别名

sql - 如何获取导致触发的事务的 Oracle 事务 ID

mysql - 以绩效为中心的声誉的数据库设计

sql - 为什么查询中的 "Where 1 <> 1"会返回所有行?

SQL Server 数据库 - 获取最后一条记录

mysql - 对mysql表中的连接记录进行排序

mysql - 努力执行嵌套更新查询

mysql - 重命名表中的所有列,删除空格

mysql - 如何使 phpMyAdmin 从 csv 正确导入日期时间?

php - 在 MySQL 中使用 distinct 函数