0

次のテーブル構造があります。

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側では各数字が出現した回数(頻度)を数えます.2番目のクエリは2番目に頻度の高い数字を選択する必要があります. 最初のクエリ:

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

これにより、テーブルから各数値の度数が正しく返されます。では第二部へ

これは私が助けが必要な場所です:

この場合、頻度が3であるため、最も頻繁に表示される番号を取得します。27の隣に最も多く表示される 1 つの番号を選択する必要があります。これは、 27の隣に 2 回表示されるため、何らかの形で番号15を取得する必要があることを意味します

私はおそらくPHP側でアルゴリズムを理解することができますが、クエリを使用してそれを行うことができるかどうか疑問に思っていましたか?

したがって、最終結果は次のようになります。

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

1 に答える 1

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 。

内部クエリは、3つの列を1つの列のみの結果セットに変換します。内部クエリを強調表示すると、どのように機能するかがわかります。次に、その結​​果セットをカウント/順序付けクエリのソースとして使用します。

于 2013-02-18T22:01:33.553 に答える