我有一张标签表,想要从列表中获得计数最高的标签。
样本数据如下所示
1 2 3
| id (1) tag ('night')
id (2) tag ('awesome')
id (3) tag ('night') |
使用
1 2
| SELECT COUNT(*), `Tag` from `images-tags`
GROUP BY `Tag` |
让我得到正在寻找的完美数据。 但是,我想对它进行组织,以使最高的标签数排在首位,并限制它仅向我发送前20个左右。
我试过了
1 2 3 4
| SELECT COUNT(id), `Tag` from `images-tags`
GROUP BY `Tag`
ORDER BY COUNT(id) DESC
LIMIT 20 |
而且我不断收到"组功能的无效使用-ErrNr 1111"
我究竟做错了什么?
我正在使用MySQL 4.1.25-Debian
在所有版本的MySQL中,只需在SELECT列表中为聚合设置别名,并按别名排序:
1 2 3 4
| SELECT COUNT(id) AS theCount, `Tag` from `images-tags`
GROUP BY `Tag`
ORDER BY theCount DESC
LIMIT 20 |
版本5之前的MySQL不允许ORDER BY子句中的聚合函数。
您可以使用不建议使用的语法来解决此限制:
1 2 3 4
| SELECT COUNT(id), `Tag` from `images-tags`
GROUP BY `Tag`
ORDER BY 1 DESC
LIMIT 20 |
1,因为它是您要分组的第一列。
我不了解MySQL,但是在MS SQL中,可以在order by子句中使用列索引。 在使用group by进行计数时,我已经这样做过,因为它往往更易于使用。
所以
1 2 3 4
| SELECT COUNT(id), `Tag` from `images-tags`
GROUP BY `Tag`
ORDER BY COUNT(id) DESC
LIMIT 20 |
成为
1 2 3 4
| SELECT COUNT(id), `Tag` from `images-tags`
GROUP BY `Tag`
ORDER 1 DESC
LIMIT 20 |
在Oracle中,类似这样的方法可以很好地将您的计数和订购分开,效果更好。 我不确定它是否可以在MySql 4中使用。
1 2 3 4 5 6 7 8
| select 'Tag', counts.cnt
from
(
select count(*) as cnt, 'Tag'
from 'images-tags'
group by 'tag'
) counts
order by counts.cnt desc |
You can get around this limit with the deprecated syntax:
ORDER BY 1 DESC
完全不建议使用此语法,它是SQL99的E121-03。
试试这个查询
1 2 3 4 5
| 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 |