【问题标题】:MySQL count useragents with distinct IP addressesMySQL 计算具有不同 IP 地址的用户代理
【发布时间】:2014-09-10 00:06:33
【问题描述】:

我构建了一个记录用户事件的应用程序。每个事件都包含用户的 IP 地址和他们的用户代理(以及其他数据,如时间戳和其他与此处无关的内容)。

我想使用单个查询来获取(在一行中)事件总数、不同 IP 地址的数量和 iPad 用户数量(不同 IP/用户代理组合的数量,其中 ugeragent 包含“iPad ")。

示例表:事件

id    ip         useragent
=================================
1    "x1"    "blabla iPad blabla"
2    "x2"    "blabla"
3    "x3"    "blabla iPad blabla"
4    "x3"    "blabla iPad blabla"
5    "x3"    "blabla iPad blabla"

预期结果

event_count    ip_count    ipad_users
=======================================
    5             3            2

我的尝试

以下查询返回 4 个 iPad 用户,因为它不检查 IP+useragent。

SELECT
    COUNT(*) as event_count,
    COUNT(DISTINCT ip) as ip_count,
    COUNT(IF( useragent LIKE '%iPad%', 1, NULL )) as ipad_users
FROM events

这个只返回 1 个 iPad 用户,因为我做错了。

SELECT
    COUNT(*) as event_count,
    COUNT(DISTINCT ip) as ip_count,
    COUNT(DISTINCT ip AND IF( useragent LIKE '%iPad%', 1, NULL )) as ipad_users
FROM events

我该怎么做?我可以在 SO 上找到的最接近的相关问题是 this one,但我无法弄清楚。

SQL Fiddle

这组数据应该返回 3 个 iPad 用户。

【问题讨论】:

    标签: mysql sql select distinct


    【解决方案1】:

    我想你只是想要一个条件count(distinct):

    SELECT
        COUNT(*) as event_count,
        COUNT(DISTINCT ip) as ip_count,
        COUNT(DISTINCT (case when useragent LIKE '%iPad%' then ip end)) as ipad_users
    FROM events;
    

    也就是说,当用户代理是 iPad 时,计算 ips 的不同数量。

    【讨论】:

    • 谢谢戈登!我不知道CASE 声明。我担心我必须进行嵌套选择,但这确实有效!我会尽快接受这个答案。
    • @blex 。 . .你可以写成count(distinct if(useragent like '%iPad%', ip, NULL))。我更喜欢case,因为它更灵活(它支持多个子句)并且它是 ANSI 标准,因此它适用于更多数据库。关键是count(distinct)里面的条件语句。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-19
    • 2017-08-29
    • 2011-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多