Mysql 选择最频繁的

Mysql 选择最频繁的,mysql,sql,sql-server,Mysql,Sql,Sql Server,如果可能的话,我想用sql找出表中出现频率最高的数字对。即: 我用数字填充了几列: num1, num2, num3, num4, num5, num6 2 3 4 5 6 7 当然行数要大一些,但你有一个想法。。 例如,目标是显示行中出现的10对数字 如果可能的话,请让我知道,否则我宁愿执行蛮力式的解决方案 请试试这个 SELECT TOP 10 num1, num2, num3, num4, num5, num6 FROM MyTable GROU

如果可能的话,我想用sql找出表中出现频率最高的数字对。即: 我用数字填充了几列:

num1, num2, num3, num4, num5, num6
2      3      4     5     6    7
当然行数要大一些,但你有一个想法。。 例如,目标是显示行中出现的10对数字

如果可能的话,请让我知道,否则我宁愿执行蛮力式的解决方案

请试试这个

SELECT TOP 10 num1, num2, num3, num4, num5, num6
FROM MyTable
GROUP BY num1, num2, num3, num4, num5, num6
ORDER BY COUNT(*) DESC
对元组中所需的所有不同列使用GROUPBY。然后通过COUNT函数进行排序。这将得到所有不同数字集的列表。要限制结果的数量,请在SELECT语句中包含10


注意:原始帖子同时包含MySql和SQLServer标签。此解决方案在SQL Server中工作。在MySql中,顶级功能不存在,您需要使用具有类似功能的。如果您需要有关如何使用的更多信息,请参阅。

要解决此问题,您需要执行以下操作:

解开柱子 执行自连接以获取对 总结以获得最常见的对。 让我给出一个在SQL Server中工作的解决方案,并对mysql进行非常小的修改:

with allnums as (
        select id, 1 as col, num1 as num from t union all
        select id, 2 as col, num2 as num from t union all
        select id, 3 as col, num3 as num from t union all
        select id, 4 as col, num4 as num from t union all
        ...
    )
select top x an1.num, an2.num, count(*)
from allnums an1 join
     allnums an2
     on an1.id = an2.id and
        an1.col < an2.col
order by count(*) desc
我认为mysql不支持with语法,因此您需要重复子查询两次,将结果放入临时表中,或者创建一个视图

您还可以使用特定于数据库的构造来表达相同的想法,例如SQLServer中的unpivot。这可以在某种程度上简化SQL,但不会太多


如果您没有为每一行指定唯一的id,那么在SQL Server中很容易做到的一件事就是在另一个with语句中使用row_number函数指定一个id。或者,您可以将所有数字转换为字符串,然后将它们连接在一起。

这不是一对,而是6元组。请澄清一下,您需要SQL Server、MySQL还是两者都需要?我这样问是因为很多新用户倾向于将他们的MySQL问题贴上标签,即使这些问题并非真正指的是Microsoft SQL Server。您能否再给出几行示例数据,以及您期望的结果是什么样的?现在还不完全清楚是希望结果显示表中出现频率最高的6个数字集,还是需要查找每行中出现频率最高的2个数字对。Adam,结果必须包括结果中出现频率最高的一对数字。你可以把它们想象成彩票号码,你想得到两个最常见的号码,这两个号码是过去选的。感谢这个查询在mysql中无法正常工作。在这里,您使用的限制声明不是top。谢谢@GordonLinoff。我正在更新我的答案,注意到你发表评论时TOP在MySql中不起作用。我现在已经更正了它,并且还包括了限制文档的链接。