我有一张计划表,例如
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)对我有用.