MySQL 统计具有不同 IP 地址的用户代理

标签 mysql sql select distinct

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

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

示例表:EVENTS

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

我该怎么做?我能找到的最相关的问题是 this one ,但我无法弄清楚。

SQL Fiddle

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

最佳答案

我认为你只想要一个条件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 时,计算 ip 的不同数量。

关于MySQL 统计具有不同 IP 地址的用户代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24831997/

相关文章:

sql - 在值子查询中指定列的数据类型

SQL聚合多个表的数据并对指定列求和

SQL INNER JOIN 更新不重复行

php - 比较三个字段

php - mysql 在同一个查询上有和 where 子句

sql - 将两个 count(*) 结果相加

php - 整合MySQL查询结果

mysql - SQL 对多个字段的计数

mysql - 根据另一个元表的条件和用户输入从表中选择

php - 单击特定单选按钮后验证文本区域框