【问题标题】:mySQL get all possible combinations of certain rowsmySQL 获取某些行的所有可能组合
【发布时间】: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 可能不是解决此类问题的正确工具。

标签: mysql sql combinations


【解决方案1】:

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

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

Finding the subsets of an array in PHP

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-06
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 2011-12-15
    • 1970-01-01
    • 2023-01-08
    相关资源
    最近更新 更多