SQL分组依据和排序依据
时间:2020-03-05 18:43:17 来源:igfitidea点击:
我有一张标签表,想从列表中获得计数最高的标签。
样本数据如下所示
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
解决方案
回答
版本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
回答
You can get around this limit with the deprecated syntax: ORDER BY 1 DESC
完全不建议使用此语法,它是SQL99的E121-03.
回答
在所有版本的MySQL中,只需在SELECT列表中为聚合设置别名,并按别名排序:
SELECT COUNT(id) AS theCount, `Tag` from `images-tags` GROUP BY `Tag` ORDER BY theCount DESC LIMIT 20