我在 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
显然数字越大,我预计结果会呈指数增长。
这样的查询甚至可能吗?我所能找到的只是使用 Joins 的结果,将每个结果的长度限制为 Join 的数量。
谢谢
更新
我找到了一篇文章 here 但最大组合数应该很小(最多 20 个左右)。 In my case with a 100 combinations I calculated that it would produce: 9426890448883247745626185743057242473809693764078951663494238777294707070023223798882976159207729119823605850588608460429412647567360000000000000000000099 rows (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 做了查询
最佳答案
您要做的是生成 Power Set具有字段 Text == <parameter>
的所有元素的集合.正如您已经发现的那样,这个数字随着输入数组的长度呈指数增长。
如果你能用其他语言(比如 php)解决它,看看这个:
关于mySQL获取某些行的所有可能组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26998962/