2013-02-18 79 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