当前位置:  开发笔记 > 后端 > 正文

SQL Group By with Order By

如何解决《SQLGroupBywithOrderBy》经验,为你挑选了4个好方法。

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

示例数据如下所示

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



1> 小智..:

在MySQL的所有版本中,只需在SELECT列表中对聚合进行别名,并按别名排序:

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


恕我直言,这是比选定答案更清晰的版本.它立刻清楚了什么是订购的.当然,如果它是一个快速的脚本,那并不重要.

2> angry person..:

版本5之前的MySQL不允许ORDER BY子句中的聚合函数.

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

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

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



3> jerhinesmith..:

我不了解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



4> JosephStyons..:

在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

推荐阅读
linjiabin43
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有