149

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

示例数据如下所示

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

4

5 回答 5

231

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

SELECT COUNT(id) AS theCount, `Tag` from `images-tags`
GROUP BY `Tag`
ORDER BY theCount DESC
LIMIT 20
于 2008-08-27T15:46:41.113 回答
54

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

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

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

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

于 2008-08-26T13:14:37.073 回答
10

我不了解 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
于 2008-08-26T13:15:36.260 回答
7

在 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
于 2008-08-26T17:34:48.617 回答
-4

试试这个查询

 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
于 2015-07-13T09:51:28.983 回答