2008-08-26 139 views
89

我有一个标签表,并希望从列表中获得最高计数标签。喜欢用SQL集团通过订单按

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

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

的样本数据看起来得到我回我在寻找完美的数据。不过,我想组织它,所以最高的标签数量是第一位的,并限制它只给我前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的

+0

是的,绝对。完成。 – maxsilver 2014-12-19 20:19:22

回答

164

在MySQL的所有版本,只需别名在SELECT列表中的聚合,并为了通过别名:

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

MySQL的前5版没有允许在ORDER聚合函数BY子句。

您可以绕过这个限制使用旧版语法:

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

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

7

我不了解MySQL,但在MS SQL中,可以使用order 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 
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 
+0

似乎在10.1.14-MariaDB(与MySQL兼容)中为我工作。我认为我不得不``作为计数`,但它仍然没有`as`部分。 – 2017-08-24 14:08:58

2

您可以绕过这个限制使用旧版语法: ORDER BY 1 DESC

此语法不弃用全部,它是SQL99的E121-03。

+4

这应该是一个评论而不是答案。 – 2014-04-24 18:53:01

+7

你不应该评论近六年的答案:-) – 2014-04-30 16:48:16

+3

Kkkk,够公平的。 – 2014-04-30 18:22:41

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