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

上一篇:mysql – 在一次查询调用中计算同一表中多列的中位数


下一篇:php – 多个表JOIN返回重复的结果,类似facebook的活动墙