【问题标题】:Counting occurrences of distinct multiple columns in SQL计算 SQL 中不同多列的出现次数
【发布时间】:2017-04-30 21:07:12
【问题描述】:

我正在尝试计算用户表中一组不同的城市和国家/地区的出现次数。

表格的设置类似于:

userid  city       country
------  ---------  --------------
1       Cambridge  United Kingdom
2       London     United Kingdom
3       Cambridge  United Kingdom
4       New York   United States

我需要的是每个城市、国家/地区的列表以及出现次数:

Cambridge, United Kingdom, 2
London, United Kingdom, 1
New York, United States, 1

目前我运行 SQL 查询来获取不同的对:

$array = SELECT DISTINCT city, country FROM usertable

然后在 PHP 中将其读入一个数组,并循环遍历该数组,运行一个查询来计算数组中每一行的每次出现次数:

SELECT count(*) FROM usertable
WHERE city = $array['city']
AND   country = $array['country']

我假设我对 SQL 的掌握不足缺少一些东西 - 正确的方法是什么,最好没有 PHP 的干预?

【问题讨论】:

    标签: sql


    【解决方案1】:
    select city, country, count(*)
    from usertable
    group by city, country
    

    【讨论】:

    • 惊人的响应速度 - 非常感谢,工作完美(我会尽快接受答案)
    • 谢谢。非常有效的查询。
    【解决方案2】:

    你需要的是一个分组:

    Select city, country, count(*) as counter
    from usertable
    group by city, country
    

    【讨论】:

    • 感谢您的快速回答 - 完美!
    【解决方案3】:
    SELECT cityandcountry, count(*) as occurrences FROM (
      SELECT DISTINCT concat(city, country) FROM tablename
    ) as baseview;
    

    如果您希望预先格式化城市和国家/地区,或者

    SELECT cityandcountry, count(*) as occurrences FROM (
      SELECT DISTINCT city, country FROM tablename
    ) as baseview;
    

    如果没有。

    【讨论】:

    • 谢谢 - 在 MySQL 中尝试这个,得到以下错误:'每个派生表必须有自己的别名'
    • 我相信这行不通。每个 count(*) 将只是 baseview 中的总行数,这不是 OP 想要的。
    • @DawoodibnKareem 你看到DISTINCT了吗?它确保baseview 视图对于每个可能的组合只有一行。
    • 哇,就在我发表原创评论八年后!嗯,我仍然认为这个查询不起作用。你测试了吗?
    • 我一直使用这样的查询,而且我很确定我在 8 年前测试过它。显然我已经不知道了。重要的部分是独特的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-07
    • 1970-01-01
    相关资源
    最近更新 更多