php - 使用 php/mysql 从表中获取统计数据的算法/查询

标签 php mysql algorithm statistics

我有以下表结构:

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.

最佳答案

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 .

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

关于php - 使用 php/mysql 从表中获取统计数据的算法/查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14945796/

相关文章:

php - 通过一个mysql查询插入到不同的表中

php - 同一页面上的 Wordpress 多个短代码不会保持元素顺序

php - Kohana SQL 准备语句安全

algorithm - 您如何看待这种兴趣点检测算法?

PHP ini 与数组性能对比

php - 短回波标签间距的 PSR 标准

mysql - 如何在 MYSQL 中连接具有相同实例的相同表?

php - nginx 验证到 mysql 后端

.net - 覆盖 GetHashCode 的最佳算法是什么?

java - 将替换正则表达式转换为 java 算法