我有以下表结构:
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.
答案 0 :(得分: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。
内部查询将三列转换为只有一列的结果集 - 突出显示内部查询,您将看到它是如何工作的。然后,我们将该结果集用作计数/排序查询的源。