检查MySQL

时间:2018-03-21 16:19:27

标签: mysql subset find-occurrences

我正在使用MySQL中的大数据集(与Java结合)并尝试实现Frequent Itemset算法。 算法的一个重复方面是计算数据集中出现一组项(一个项是随机整数)的次数。

以此小数据集 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 的每一行的每次出现次数。基本上 T

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

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

2 个答案:

答案 0 :(得分:1)

如果你可以将数据重组为每行一个值,对于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。

答案 1 :(得分:0)

由于Uueerdo的回答,我意识到我必须使用不同的结构,所以不要使用表 T

{{1}}

我现在使用 Tnew

{{1}}

这在SQL中更容易实现,您可以使用Group By和Join来获得所需的结果。该查询适用于具有相同ID的任意数量的项目。此外,您不必使用值NULL并且数据集更容易创建

如果有人想知道我最终使用的查询,请告诉我(做一些工作来提出好的桌面名称并使其清晰易懂)。