mysql - 检查项目集是否出现在 MySQL 行中

标签 mysql subset find-occurrences

我正在 MySQL 中处理大型数据集(结合 Java)并尝试实现频繁项集算法。 该算法的一个重复方面是计算一组项目(一个项目是一个随机整数)在数据集中出现的次数。

以这个小数据集 T 为例:

ID | COL1 | COL2 | COL3 | COL4 | COL5 |
---------------------------------------
1  |   8  |  35  |  42  |  12  |  27  |
2  |  22  |  42  |  35  |  8   | NULL |
3  |  18  |  22  |   8  | NULL | NULL |
4  |  42  |  12  |  27  |  35  |  8   |
5  |  18  |  27  |  12  |  22  | NULL |

还有这张表T2:

COL1 | COL2 |
-------------
35   | 27   |
22   | 8    |
42   | 8    |
18   | 35   |
35   | 42   |

我想要的结果是下表(它也可以是查询的答案):

COL1 | COL2 | COUNT |
---------------------
35   | 27   | 2     |
22   | 8    | 2     |
42   | 8    | 3     |
18   | 35   | 0     |
35   | 42   | 3     |

所以我想计算表T中表T2的每一行的每次出现。基本上 T2 的行是 T

中行的子集有多少次

这必须在每一代算法中完成。这是一个非常小的示例,最终必须对 T3(具有 3 个项目的行)、T4(具有 4 个项目的行)等进行相同的操作。表 T 保持不变。 我还必须考虑到顺序无关紧要(|35、27| = |27、35|),并且它们可能不会出现在 T 中彼此相邻的列中/p>

是否可以在不遍历数据集太多次的情况下执行此操作(太多 = 超过 T2 的行数)? 将一行表示为一个元组(例如 (35, 27))以便它成为一个项目会更好吗?

最佳答案

如果您可以将数据重组为每行一个值,对于 T 和 TN,这样的事情应该同时适用于所有 TN。

SELECT n_id, COUNT(CASE WHEN matches = n_count THEN v_id ELSE NULL) AS occurences
FROM (
  SELECT n.n_id, v.set_id AS v_id, n.n_count, COUNT(*) AS matches
  FROM (SELECT n_id, COUNT(*) AS n_count FROM tN GROUP BY id) AS n
  INNER JOIN tN AS nv ON n.n_id = nv.n_id
  LEFT JOIN T_VALUES AS v ON nv.value = v.value
  GROUP BY n.n_id, v.set_id, n.n_count
) AS subQ;

如果您需要在最终结果中使用 TN 值,那么类似这样的结果会很接近。

SELECT n_id, n_values, COUNT(CASE WHEN matches = n_count THEN v_id ELSE NULL) AS occurences
FROM (
  SELECT n.n_id, n.n_count, n.n_values, v.set_id AS v_id, COUNT(*) AS matches
  FROM (
       SELECT n_id, COUNT(*) AS n_count 
          , GROUP_CONCAT(n.value) AS n_values
       FROM tN 
       GROUP BY id
  ) AS n
  INNER JOIN tN AS nv ON n.n_id = nv.n_id
  LEFT JOIN T_VALUES AS v ON nv.value = v.value
  GROUP BY n.n_id, n.n_count, n.n_values, v.set_id
) AS subQ;

注意:您可能不用子查询就可以逃脱,但最终可能会让数据库为 T 的每一行重复计算相同的 n_count 和 n_values。

关于mysql - 检查项目集是否出现在 MySQL 行中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49411559/

相关文章:

string - 使用scala查找给定字符串是另一个字符串的子字符串的次数

r - 基于百分比的子集数据框

arrays - mongodb查询数组的子集

php - MySQL 表 - ID 字段中存在较大间隙

mysql - UPDATE 查询涉及来自同一个表的 2 个独立 SELECT 语句的结果

r - 按多个因子级别对数据框进行子集

regex - Ansible:如何查找变量中出现的单词?

python - 如何替换除第一个以外的所有事件?

php - 将html实体存储在数据库中?还是在检索时转换?

mysql - Hibernate 多重连接