【问题标题】:Get count of all combinations of numbers PHP获取所有数字组合的计数PHP
【发布时间】: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 &amp; 5 数字组合?有什么办法吗?

【问题讨论】:

  • 我的第一个想法是,由于您的需求,您必须将数据模型更改为关系模型。字符串列中的逗号分隔数字永远不会像单独的数字表那样紧密,主记录/表具有外键。
  • @twicejr 我知道,但在这种情况下,连续 5 个数字只是一种类型。可能存在连续数字为 6 或 7 的情况。因此,表格中不能有 5 列
  • 我已经发布了一个基于我想到的数据模型的答案。

标签: php statistics


【解决方案1】:

在您的案例中使用的示例数据模型,它将支持基于 SQL 的方法而不是循环:

CREATE TABLE `thingtable` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 PRIMARY KEY (`id`)
)

CREATE TABLE `thing_numbers` (
 `thing_id` int(11) NOT NULL,
 `numberval` int(11) NOT NULL
)



INSERT INTO `thing_numbers` (`thing_id`, `numberval`) VALUES
(1, 5),
(1, 12),
(2, 5),
(2, 13);

SELECT COUNT(thing_id), thing_id FROM `thing_numbers` WHERE numberval IN (5,12) GROUP BY thing_id 
/*will show
 COUNT(thing_id)    thing_id    
 2                      1
 1                      2
 */

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多