从关系中选择最常见的值 - SQL语句

11

我在数据库中有一张表,其中有许多记录,其中某些记录在其中一个列上共享相同的值。例如:

|  id  |  name  |  software  |
______________________________
|  1   |  john  |  photoshop |
|  2   |  paul  |  photoshop |
|  3   |  gary  |  textmate  |
|  4   |  ade   |  fireworks |
|  5   |  fred  |  textmate  |
|  6   |  bob   |  photoshop |
我想通过使用SQL语句返回出现最频繁的软件名称。在上面的示例中,所需的SQL语句将返回“photoshop”,因为它比其他任何软件都更常见。这种操作是否可行?谢谢您的时间。

2
@Ronnie:你使用的是哪个版本的数据库?MySQL?Oracle? - Michael Mao
抱歉,我正在使用MySQL。 - Ronnie
可能是在SQL中获取最常见的值的重复问题。 - user2284570
3个回答

22
select top 1 software 
from your_table 
group by software
order by count(*) desc 

谢谢卡尔,'top 1' 部分是什么意思?感谢您的快速回复。 - Ronnie
1
@Ronnie 它从查询结果的顶部返回匹配项,这些匹配项按降序排列,在这种情况下返回指定数量的记录。 - msarchet
所以,这个语句将按照最常见软件组的顺序对所有记录进行分组,并且降序排列。但是,“top 1”只选择第一组中的值? - Ronnie
我已经在phpmyadmin上使用表测试了这个语句,但它返回一个错误,指出“您的SQL语法有误”? - Ronnie
8
ه¯¹ن؛ژMySQL,هژ»وژ‰top 1,هœ¨order byهگژé‌¢و·»هٹ limit 1م€‚ - Andomar
@Andomar 太好了,这很有效,感谢您的评论和 Carl。 - Ronnie

4

这要看你想使用标准SQL还是供应商特定的扩展(另一位用户有一个“前N个”查询,这不是标准的)。标准解决方案如下:

SELECT software, COUNT(1) 
FROM tablename
GROUP BY software
HAVING COUNT(1) = (
  SELECT MAX(sc) FROM (
    SELECT software, COUNT(1) sc
    FROM tablename
    GROUP BY software
  )
)

注意: 如果有多个软件发生次数相同,则可能会返回多行。


0
你可以用很多种方法来做,但最简单的方法是这样的。
SELECT item  
FROM (SELECT item FROM your_table GROUP BY item ORDER BY COUNT(*) desc)  
WHERE ROWNUM<=1;

MySQL 没有 ROWNUM - Barmar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接