带有 OrderBy 的 SQLGroupBy

我有一个标签表,并希望从列表中获得最高的计数标签。

样本数据如下所示

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

694622 次浏览

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

您可以使用不推荐的语法来绕过这个限制:

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

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

我不了解 MySQL,但是在 MSSQL 中,您可以使用 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

在 Oracle 中,类似这样的工具可以很好地将计数和排序分离开来。我不确定它是否能在 MySql4中工作。

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

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

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

试试这个查询

 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