SQL分组依据和排序依据


122

我有一张标签表,想从列表中获得计数最高的标签。

样本数据如下所示

id (1) tag ('night')
id (2) tag ('awesome')
id (3) tag ('night')

使用

SELECT COUNT(*), `Tag` from `images-tags`
GROUP BY `Tag`

让我得到正在寻找的完美数据。但是,我希望对它进行组织,以使最高的标签数排在首位,并限制它仅向我发送前20个左右。

我试过了

SELECT COUNT(id), `Tag` from `images-tags`
GROUP BY `Tag`
ORDER BY COUNT(id) DESC
LIMIT 20

而且我不断收到“组功能的无效使用-ErrNr 1111”

我究竟做错了什么?

我正在使用MySQL 4.1.25-Debian

Answers:


199

在所有版本的MySQL中,只需在SELECT列表中为聚合设置别名,并按别名排序:

SELECT COUNT(id) AS theCount, `Tag` from `images-tags`
GROUP BY `Tag`
ORDER BY theCount DESC
LIMIT 20

9
恕我直言,这是比所选答案更干净的版本。立即知道订购的是什么。当然,如果它是快速脚本,那也没关系。
JustAPoring 2013年

1
尽管OP使用的是MySQL,但此答案也适用于HSQL(内置Libreoffice)
Arno Teigseth

53

版本5之前的MySQL不允许ORDER BY子句中的聚合函数。

您可以使用不建议使用的语法来绕过此限制:

SELECT COUNT(id), `Tag` from `images-tags`
GROUP BY `Tag`
ORDER BY 1 DESC
LIMIT 20

1,因为它是您要分组的第一列。


8

我不了解MySQL,但是在MS SQL中,可以在order by子句中使用列索引。在使用group bys 进行计数之前,我已经完成了此操作,因为它更易于使用。

所以

SELECT COUNT(id), `Tag` from `images-tags`
GROUP BY `Tag`
ORDER BY COUNT(id) DESC
LIMIT 20

成为

SELECT COUNT(id), `Tag` from `images-tags`
GROUP BY `Tag`
ORDER 1 DESC
LIMIT 20

6

在Oracle中,类似这样的方法可以很好地将您的计数和订购分开,效果更好。我不确定它是否可以在MySql 4中使用。

select 'Tag', counts.cnt
from
  (
  select count(*) as cnt, 'Tag'
  from 'images-tags'
  group by 'tag'
  ) counts
order by counts.cnt desc

似乎在10.1.14-MariaDB(与MySQL兼容)中对我有用。我以为我必须拥有) as counts它,但是它仍然可以正常工作as
哈里·佩科宁

3

您可以使用不建议使用的语法来绕过此限制:ORDER BY 1 DESC

完全不建议使用此语法,它是SQL99的E121-03。


5
这应该是评论而不是答案。
拉斐尔·巴罗斯

0

试试这个查询

 SELECT  data_collector_id , count (data_collector_id ) as frequency 
    from rent_flats 
    where is_contact_person_landlord = 'True' 
    GROUP BY data_collector_id 
    ORDER BY count(data_collector_id) DESC

这与问题有什么关系?字段甚至都不相同。
布莱克斯(Blakes),2015年7
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.