2013-02-18 75 views
0

得到表的统计数据,我有以下表结构:算法/查询使用PHP/MySQL的

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); 

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

这是我需要帮助:

我得到的最频繁的出现在这种情况下,数量及其,因为它的频率是,我需要选择1号码出现最接近意味着我需要得到某种数字因为它出现两次旁边。

我大概可以算出PHP方面的算法,但我想知道是否有可能使用查询做到这一点?

所以最终的结果将是:

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

回答

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

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

+0

你能解释与联盟的内部查询部分? – GGio 2013-02-18 22:09:04