【问题标题】:algorithm/query to get statistical data from table using php/mysql使用 php/mysql 从表中获取统计数据的算法/查询
【发布时间】:2013-02-03 10:39:27
【问题描述】:

我的表结构如下:

CREATE TABLE test(
   myID INT,
   num1 INT,
   num2 INT,
   num3 INT,
   PRIMARY KEY (myID)
)engine=innodb;

现在我在表中有以下数据:

myID   num1   num2   num3
1      15     27     98
2      27     38     66
3      15     27     77

现在我需要运行 2 个查询,第一个查询运行以选择所有数字,在 PHP 端我计算每个数字出现的次数(频率),第二个查询应该选择第二个最频繁的数字。 第一个查询:

$numfreq = PDO->prepare('
                SELECT num1, num2, num3
                FROM test
            ');
   $numfreq->execute();
   $allNums = array();
   while ($row = $numfreq->fetch(PDO::FETCH_ASSOC)) {
      $allNums[] = intval($row['num1']);
      $allNums[] = intval($row['num2']);
      $allNums[] = intval($row['num3']);
   }

   $numFrequencies = array_count_values($allNums);
   arsort($numFrequencies);

这会正确返回表格中每个数字的频率。现在是第二部分

这是我需要帮助的地方:

在这种情况下,我得到了出现频率最高的数字 27,因为它的频率是 3,我需要选择在 旁边出现最多的 1 个数字>27 表示我需要以某种方式获得数字 15,因为它在 27 旁边出现了两次。

我大概可以找出 PHP 端的算法,但我想知道是否可以使用查询来做到这一点?

所以最终的结果是:

most frequent number: 27
most frequent number 27 combined with 15 appears 2 times and is most frequent combination.

【问题讨论】:

    标签: php mysql algorithm statistics


    【解决方案1】:
    select val, count(val) as frequency
    from 
    (select num1 as val from test
     union all
     select num2 as val from test
     union all
     select num3 as val from test
     ) as b
    group by val
    order by frequency desc
    limit 2
    

    Sqlfiddle here

    内部查询将三列转换为只有一列的结果集 - 突出显示内部查询,您将看到它是如何工作的。然后,我们使用该结果集作为计数/排序查询的源。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-25
      • 1970-01-01
      • 1970-01-01
      • 2013-10-28
      • 2020-12-17
      相关资源
      最近更新 更多