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

Posted

技术标签:

【中文标题】mySQL 获取某些行的所有可能组合【英文标题】:mySQL get all possible combinations of certain rows 【发布时间】:2015-01-15 21:58:34 【问题描述】:

我在 mysql 中有一个奇怪的请求。通过添加更多连接,我发现了许多方法可以针对组合对或某个其他数量执行此操作,但我想知道是否有针对任意数量的组合执行此操作的动态方式。

解释一下如果我有一个表 table 有 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

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

这样的查询甚至可能吗?我只能找到使用 Joins 的结果,将每个结果的长度限制为 Joins 的数量。

谢谢

更新

我找到了一篇文章here,但组合的最大数量应该很小(最多 20 个左右)。在我的情况与100组合余计算,这将产生:9426890448883247745626185743057242473809693764078951663494238777294707070023223798882976159207729119823605850588608460429412647567360000000000000000000099行(LOL) P>

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

但是有没有办法通过最多 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 进行了查询

【问题讨论】:

您可以使用存储过程来完成。除此之外,循环的唯一方法是加入一个表,该表的行数与您需要的重复次数一样多。 你有一张包含很多很多数字的表格吗? 我发现了这个:dba.stackexchange.com/questions/29661/… 这看起来很有希望,但似乎对组合数量有限制。我的最大值可能是 100 个数字。 虽然 T-SQL 解决方案令人印象深刻,但 (my)SQL 可能不是解决此类问题的正确工具。 【参考方案1】:

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

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

Finding the subsets of an array in PHP

【讨论】:

以上是关于mySQL 获取某些行的所有可能组合的主要内容,如果未能解决你的问题,请参考以下文章

Pandas:所有可能的行组合

获取所有可能的单词组合

如何从 2 个或更多矩阵的所有可能组合中创建矩阵?

获取数组中所有可能的字符组合

只有某些位可以改变的二进制数的所有组合

更快的方法来总结数据框中的所有行组合