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 获取某些行的所有可能组合的主要内容,如果未能解决你的问题,请参考以下文章