mySQL获取某些行的所有可能组合

时间:2014-11-18 16:19:19

标签: mysql sql combinations

我在mySQL中有一个奇怪的请求。通过添加更多联接,我找到了很多方法来为成对组合或某个其他数字执行此操作,但我想知道是否有动态方法为任意数量的组合执行此操作。

解释我是否有一个表有1列(column_id)和(column_text)

Id | Text
--------
1  | A
2  | B
3  | B
4  | B
5  | A

然后通过运行带参数A的过程GetCombinations应该产生:

CombinationId | Combinations
---------------------------
1             |      1
2             |      5
3             |      1,5

通过运行带参数B的过程GetCombinations应该产生:

CombinationId | Combinations
---------------------------
1             |      2
2             |      3
3             |      4
4             |      2,3
5             |      2,4
6             |      3,4
7             |      2,3,4

显然数字越大,我预计结果会呈指数增长。

这样的查询是否可能?我只能找到使用连接的结果,将每个结果的长度限制为连接数。

谢谢

更新

我找到了一篇文章here,但组合的最大数量应该很小(最多20个左右)。在我的情况下有100个组合我计算它会产生:9426890448883247745626185743057242473809693764078951663494238777294707070023223798882976159207729119823605850588608460429412647567360000000000000000000099行(lol)

所以我将我的答案归类为不可行

然而,是否有办法以最多2个组合获得此结果?

CombinationId | Combinations
---------------------------
1             |      2
2             |      3
3             |      4
4             |      2,3
5             |      2,4
6             |      3,4

我找到了一个使用JOIN获取所有组合的查询,但我不知道如何生成组合ID以及如何获取各行。

更新2

使用

解决它
SELECT @rownum := @rownum + 1 AS 'CombinationId'
cross join (select @rownum := 0) r

我用UNION ALL

进行查询

1 个答案:

答案 0 :(得分:1)

您要做的是使用字段Text == <parameter>生成所有元素集的Power Set。正如您已经发现的那样,这个数字随着输入数组的长度呈指数增长。

如果你能用其他语言解决它(比如说php),请看看:

Finding the subsets of an array in PHP