【发布时间】:2014-10-05 17:11:06
【问题描述】:
我的表格有一列包含 5 个逗号分隔的数字。示例:5, 12, 88, 155, 201,。
共有10000+ rows。我需要一种方法来计算现有表中每对的计数。
规则:
- 同一记录中不能存在相同的数字,所有数字在一条记录中都是唯一的
- 数字始终按升序排列并保存
- 最大数量为 255
- 最小值为 1
例如,我需要知道数字5 & 12 或数字88 & 155 或数字5 & 155 一起出现的次数。
我认为我可以做的一种方法是使用双 for 循环,但似乎很慢,并且不适用于三重组合或四个最常见的数字。
我的代码:
for ($i = 1; $i <= 255; $i++) {
for ($j = 1; $j <= 255; $j++) {
// two numbers cant exist in same record
if ($i === $j) continue;
$total = $this->db->getTotalNumFrequencies($i, $j);
}
}
示例记录:
记录 1:5, 12, 88, 155, 201,
记录 2:1, 5, 55, 88, 255,
记录 3:1,55, 99, 151, 191,
示例输出:
组合 1:5, 88,计数:2,出现在记录中:1, 2
组合 1:1, 55,计数:2,出现在记录中:2, 3
现在这段代码可以很好地获得 2 个数字组合计数。在不使用嵌套循环的情况下如何获得3, 4 & 5 数字组合?有什么办法吗?
【问题讨论】:
-
我的第一个想法是,由于您的需求,您必须将数据模型更改为关系模型。字符串列中的逗号分隔数字永远不会像单独的数字表那样紧密,主记录/表具有外键。
-
@twicejr 我知道,但在这种情况下,连续 5 个数字只是一种类型。可能存在连续数字为 6 或 7 的情况。因此,表格中不能有 5 列
-
我已经发布了一个基于我想到的数据模型的答案。
标签: php statistics