SQL Group By with Order By

时间:2008-08-26 13:09:16

标签: mysql sql mysql-error-1111

我有一个标签表,想要从列表中获取最高计数标签。

示例数据如下所示

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

6 个答案:

答案 0 :(得分:181)

在所有版本的MySQL中,只需在SELECT列表中对聚合进行别名,并按别名排序:

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

答案 1 :(得分:51)

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

您可以使用不推荐使用的语法来解决此限制:

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

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

答案 2 :(得分:7)

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

所以

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

答案 3 :(得分:4)

在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

答案 4 :(得分:2)

  

您可以使用不推荐使用的语法来解决此限制:   订购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