【问题标题】:Select distinct column_a and group by column_b选择不同的 column_a 并按 column_b 分组
【发布时间】:2014-07-30 02:23:13
【问题描述】:

我有一个包含这两列的表格:

ip    country

这些是我在我的网站上拥有的观众。我正在尝试查看我从每个国家/地区获得了多少唯一 IP。

我想出了这个:

SELECT DISTINCT ip, country, count(*) as views FROM views GROUP BY country

我希望这会按国家/地区选择不同 IP 的数量以及它们所在的国家/地区。然后我会有一个列 views 保存计数。

但这不起作用,此查询返回按国家/地区分组的总行数。不管有没有DISTINCT ip,我都会得到相同的结果。

编辑:我没有清楚地表达自己,我想弄清楚的是每个国家/地区有多少独特的 IP

我的一些 IP 在数据库中是重复的,相同的 IP 出现了 3-4 次。我想忽略这一点:

输入样本:

**ip**    **country**
1.1.1.1       USA
1.1.1.1       USA
1.1.1.1       USA
1.1.1.1       USA
1.1.1.2       USA
1.1.1.2       USA
1.1.1.2       USA
1.1.1.3       GER
1.1.1.3       GER
1.1.1.5       GER

应该输出:

USA -> 2
GER -> 2

即:有两个不同的美国 IP 和两个不同的德国 IP。

【问题讨论】:

  • 您能否发布输入行的示例和您希望输出的示例?在 GROUP BY 的上下文中,很难理解您想要返回的 ip。
  • 你是要获取国家、ips总数还是distinct ips总数,然后还要列出那些distinct ips?

标签: mysql sql


【解决方案1】:

试试这个:

SELECT
    country,
    count(DISTINCT ip) views
FROM views
GROUP BY country
ORDER BY country;

【讨论】:

  • 我相信独特的功能永远是第一位的
  • @Charlesliam:你是对的,DISTINCT 关键字仅在某些位置被接受,例如COUNT(DISTINCT expr) 有效。但是DISTINCT 是一个关键字不是一个函数
  • 注意,我会记住 Distinct 是一个关键字。这对于在 OCA 多项选择中选择正确答案非常有帮助。
【解决方案2】:

@Joseph B SQL 的小改动

Select country, views
FROM (SELECT count(DISTINCT ip) views,
             country 
      FROM views
      GROUP BY country
      ORDER BY country);

【讨论】:

  • @Charlesliam:我不明白使用内联视图获取指定结果集有什么好处。我们知道这会导致 MySQL 在外部查询运行之前将视图查询具体化到一个临时的 MyISAM 表中,这会影响性能。此外,此语句将引发“每个派生表都必须有一个别名”错误。
猜你喜欢
  • 1970-01-01
  • 2018-02-10
  • 1970-01-01
  • 2013-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-24
  • 1970-01-01
相关资源
最近更新 更多