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 |),而且它们可能不会在
是否可以这样做而不必过多地遍历数据集(而过多=多于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_值。

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

相关文章:

mysql - MySQL Pivot查询-SUM()出现问题

mysql - 如何在select语句中获取变量值作为表名

r - 使用 ggplot2 在 dplyr 链中设置子集/过滤器

r - R中的子集字符向量

javascript - 如何使用 JavaScript 找到出现次数最多的数字?

java - 计算字符串出现次数的最佳方式/数据结构

mysql - MYSQL查询以计算mysql服务器中存在的模式数量

PHP MySQLi fetch "array push"覆盖数据

r - 如果组中的行数超过 X 个观察值,则随机抽样 X 个行数

java - 我的程序不会要求用户输入文件中出现的内容