每个值按COUNT排序

Enk*_*kay 48 mysql sql count sql-order-by

我有一个存储ID和商店所在城市的表.

我想列出从商店最多的商店开始的所有商店.

ID CITY
1  NYC
2  BOS
3  BOS
4  NYC
5  NYC
Run Code Online (Sandbox Code Playgroud)

我想要的输出是以下,因为我在纽约市拥有最多的商店,我希望首先列出所有纽约市的位置.

1  NYC
4  NYC
5  NYC
2  BOS
3  BOS
Run Code Online (Sandbox Code Playgroud)

Min*_*ker 62

SELECT count(City), City
FROM table
GROUP BY City
ORDER BY count(City);
Run Code Online (Sandbox Code Playgroud)

要么

SELECT count(City) as count, City
FROM table
GROUP BY City
ORDER BY count;
Run Code Online (Sandbox Code Playgroud)

啊,对不起,我误解了你的问题.我相信Peter Langs的回答是正确的.

  • 如果您将ID添加到'GROUP BY',它将列出所有争议 (3认同)
  • 是的,但我的商店不一样,我在纽约有3家不同的商店,有独特的商店ID.我需要列出每个商店.我只想要他们在商店数量最多的城市订购. (2认同)

Pet*_*ang 29

这个计算单独查询中的计数,加入它和按该计数排序(SQL-Fiddle):

SELECT c.id, c.city
FROM cities c
JOIN ( SELECT city, COUNT(*) AS cnt
       FROM cities
       GROUP BY city
     ) c2 ON ( c2.city = c.city )
ORDER BY c2.cnt DESC;
Run Code Online (Sandbox Code Playgroud)

  • @jdwee:你可以在`ORDER BY`子句之前添加它.如果它也应该反映在COUNT上,那么你要么必须在子查询中重复它,要么更好:使用[CTE](https://dev.mysql.com/doc/refman/8.0/en/with. HTML).如果这没有帮助,请改为发布单独的问题. (2认同)

Vin*_*nie 6

这个解决方案不是一个非常优秀的解决方案,所以如果你的表非常大,它将需要一些时间来执行,但它会按照你的要求进行.

 select c.city, c.id, 
      (select count(*) as cnt from city c2 
       where c2.city = c.city) as order_col
 from city c
 order by order_col desc
Run Code Online (Sandbox Code Playgroud)

也就是说,对于您遇到的每个城市,您都在计算该城市在数据库中出现的次数.

免责声明:这可以满足您的要求,但我不建议将其用于行数过大的生产环境.

  • 它的工作,谢谢,但什么是最佳解决方案? (3认同)