我构建了一个记录用户事件的应用程序。每个事件都包含用户的 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/