我有一张计划表,例如

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)对我有用.

标签: mysql, postgresql, sql, duplicates

相关文章推荐

添加新评论,含*的栏目为必填