【问题标题】:Order by COUNT per value按每个值 COUNT 排序
【发布时间】:2011-01-18 00:07:43
【问题描述】:

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

我想列出所有商店,从商店最多的城市的商店开始。

表格

ID CITY
1  NYC
2  BOS
3  BOS
4  NYC
5  NYC

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

1  NYC
4  NYC
5  NYC
2  BOS
3  BOS

【问题讨论】:

标签: mysql sql count sql-order-by


【解决方案1】:

这个在一个单独的查询中计算计数,加入它并按该计数排序 (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;

【讨论】:

  • 你怎么能在其中添加 WHERE?
  • @jdwee:您可以在ORDER BY 子句之前添加它。如果它还应该反映在 COUNT 上,那么您必须在子查询中重复它,或者更好:使用 CTE。如果这没有帮助,请发布一个单独的问题。
【解决方案2】:
SELECT `FirstAddressLine4`, count(*) AS `Count` 
FROM `leads` 
WHERE `Status`='Yes'
AND `broker_id`='0'
GROUPBY `FirstAddressLine4` 
ORDERBY `Count` DESC 
LIMIT 0, 8

【讨论】:

    【解决方案3】:
    SELECT count(City), City
    FROM table
    GROUP BY City
    ORDER BY count(City);
    

    SELECT count(City) as count, City
    FROM table
    GROUP BY City
    ORDER BY count;
    

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

    【讨论】:

    • 也许我做得不对,但是当我使用“分组依据”而不是列出每个单独的商店时,它只会列出纽约市的 1 家商店和 BOS 的 1 家商店。知道可能出了什么问题吗?
    • Enkay:这正是 group by 所做的。它压缩了相同的条目。
    • 是的,但我的商店并不相同,我在纽约市有 3 家不同的商店,都有唯一的商店 ID。我需要列出每个单独的商店。我只希望它们按商店数量最多的城市订购。
    • 如果您将 Id 添加到“GROUP BY”,它将列出所有 stroes
    【解决方案4】:

    此解决方案不是一个非常理想的解决方案,因此如果您的表非常大,执行将需要一些时间,但它可以满足您的要求。

     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
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-23
      • 2011-10-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多