微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

sql – 用于将置换转换为行组合的左连接条件

我有一张计划表,例如

id | service_1 | service_2 | ...
---------------------------------
1  |   true    |  true     | ...
2  |   true    |  false    | ...
3  |   false   |  true     | ...

我通过左边连接表自己(任意次)生成行的排列.

SELECT t1.id, t2.id, t3.id
FROM plans AS t1 
LEFT JOIN plans AS t2
  ON t1.id != t2.id
  AND ...
LEFT JOIN plans AS t3
  ON t1.id != t2.id AND t2.id != t3.id AND t3.id != t1.id
  AND ...

如何生成提供service_1和service_2的所有不同组合,同时避免重复.加入行不能包含相同的服务,例如

id | service_1 | service_2 | id | service_1 | service_2 |
---------------------------------------------------------
1  |   true    |  true     |NULL|    NULL   |    NULL   |
2  |   true    |  false    | 3  |    false  |    true   |

我正在努力解决这种方法的连接条件.另外,这根本上是解决这个问题的错误方法吗?

我试图避免重复的可能方法是:

>有序集(我还没有让这个工作),例如t1.id< t2.id
> sort(array [t1.id,t2.id])AS ID … GROUP BY ID

解决方法:

Also, is this fundamentally the wrong
approach for solving this problem?

我认同.这看起来类似于set packing problem和/或set cover problem.

我不认为使用单个查询执行此操作是可行的(或者甚至可能).你需要尽可能多的连接来覆盖服务,并且许多WHERE条件是该数字的函数.

我认为一个简单修剪的天真,蛮力的方法可能在这里工作,因为你想要的是所有可能组合的列表无论如何.或者您可以预先计算所有有效组合并将它们存储在一个大表中.

无论你做什么,这看起来至少O(rowscols)对我有用.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐