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

5

我在mySQL中有一个奇怪的请求。我发现很多方法可以通过添加更多的连接来处理组合对或某个其他数字,但我想知道是否有一种动态的方法可以处理任意数量的组合。

为了解释,如果我有一个表格,它有1列(column_id)和1列(column_text)

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

然后通过运行一个名为GetCombinations的过程并带有参数A,应该会得到以下结果:
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

显然,数字越大,我期望结果指数增加。
这样的查询是否可能?我找到的所有结果都使用了Join,并将每个结果的长度限制为Join的数量。
谢谢
更新
我在这里找到了一篇文章here,但组合的最大数量应该很小(最多20个左右)。在我的情况下,如果有100个组合,我计算出查询将产生:9426890448883247745626185743057242473809693764078951663494238777294707070023223798882976159207729119823605850588608460429412647567360000000000000000000099行(笑)
所以我认为我的答案是不可行的。
然而,有没有办法用最多两个组合得到这个结果?
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
你可能可以使用存储过程来完成它。除此之外,唯一的循环方式是通过与具有所需重复次数的行数的表连接。 - Barmar
你有一个包含大量数字的表格吗? - Gordon Linoff
我找到了这个链接:http://dba.stackexchange.com/questions/29661/sql-query-for-combinations-without-repetition,看起来很有前途,但似乎在组合数量上有限制。我的最大可能是100个数字。 - Nick
尽管那个 T-SQL 的解决方案令人印象深刻,但是(我)SQL 可能不是解决这类问题的正确工具。 - Strawberry
1个回答

1
你想做的是生成所有字段为Text == <parameter>的元素集合的幂集。正如你已经发现的那样,这个数字会随着输入数组的长度呈指数级增长。
如果你能用其他语言(比如php)解决它,请看一下这个: 在PHP中找到数组的子集

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接