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

标签 mysql sql combinations

我在 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)解决它,看看这个:

Finding the subsets of an array in PHP

关于mySQL获取某些行的所有可能组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26998962/

相关文章:

sql - 从 prestodb 中选择多个列的不同列

sql - Postgres : Add constraint if it doesn't already exist

python - 重新排列字符串/列表的所有方法的列表

PHP PDO 错误消息作为变量发送到电子邮件中

php - 删除后 MySQL 查询变慢

MySQL : find repeating events that are outdated

string - "overlay"字符串算法

r - 如何在 R 中获得组合向量?

mysql - 我可以在不使用索引的情况下优化这样的 MySQL 查询吗?

php - 日期在 LIMIT 之间的 Codeigniter JOIN 查询不起作用