我有一个标签表,想从列表中获取最高计数标签.
示例数据如下所示
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
在MySQL的所有版本中,只需在SELECT列表中对聚合进行别名,并按别名排序:
SELECT COUNT(id) AS theCount, `Tag` from `images-tags` GROUP BY `Tag` ORDER BY theCount DESC LIMIT 20
版本5之前的MySQL不允许ORDER BY子句中的聚合函数.
您可以使用不推荐使用的语法来绕过此限制:
SELECT COUNT(id), `Tag` from `images-tags` GROUP BY `Tag` ORDER BY 1 DESC LIMIT 20
1,因为它是您想要分组的第一列.
我不了解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
在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