SQL Group By with Order By

max*_*ver 116 mysql sql mysql-error-1111

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

示例数据如下所示

id (1) tag ('night')
id (2) tag ('awesome')
id (3) tag ('night')
Run Code Online (Sandbox Code Playgroud)

运用

SELECT COUNT(*), `Tag` from `images-tags`
GROUP BY `Tag`
Run Code Online (Sandbox Code Playgroud)

让我找回我正在寻找的数据.但是,我想组织它,以便最高标签计数是第一个,并限制它只发送给我前20个左右.

我试过这个......

SELECT COUNT(id), `Tag` from `images-tags`
GROUP BY `Tag`
ORDER BY COUNT(id) DESC
LIMIT 20
Run Code Online (Sandbox Code Playgroud)

而且我一直在"无效使用群组功能 - ErrNr 1111"

我究竟做错了什么?

我正在使用MySQL 4.1.25-Debian

小智 193

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

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

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

ang*_*son 51

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

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

SELECT COUNT(id), `Tag` from `images-tags`
GROUP BY `Tag`
ORDER BY 1 DESC
LIMIT 20
Run Code Online (Sandbox Code Playgroud)

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


jer*_*ith 8

我不了解MySQL,但在MS SQL中,您可以在order by子句中使用列索引.我之前做过这个,group by因为它更容易使用.

所以

SELECT COUNT(id), `Tag` from `images-tags`
GROUP BY `Tag`
ORDER BY COUNT(id) DESC
LIMIT 20
Run Code Online (Sandbox Code Playgroud)

SELECT COUNT(id), `Tag` from `images-tags`
GROUP BY `Tag`
ORDER 1 DESC
LIMIT 20
Run Code Online (Sandbox Code Playgroud)


Jos*_*ons 5

在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
Run Code Online (Sandbox Code Playgroud)