我构建了一个记录用户事件的应用程序。每个事件都包含用户的IP地址及其使用者(以及其他数据,如时间戳和其他与此无关的内容)。
我想使用单个查询来获取(在一行中)事件总数,不同IP地址的数量以及iPad用户的数量(ugeragent包含的不同IP /用户组合的数量&# 34; 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 +使用者。
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,但我无法弄明白。
这组数据应该会让3位iPad用户回归。
答案 0 :(得分:3)
我想你只想要一个条件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
的不同数量。