如何编写SQL查询统计同时注册两款游戏的用户数量?
嘿,别发愁!这种统计需求太常见了,但得先摸清楚你的数据库表结构才行。我先给你拆解下最常见的几种表结构场景,再给你对应的SQL写法,你可以对照自己的实际情况调整。
第一步:先搞清楚你的表结构(这是核心!)
最常见的两种存储用户游戏注册数据的方式:
- 场景1:单表存所有注册记录:比如有一张
user_game_registrations表,每一行代表一个用户注册一款游戏的记录,字段通常会有user_id(用户唯一标识)、game_id(游戏唯一标识,比如游戏A是1,游戏B是2)、registration_time(注册时间)这类。 - 场景2:用户表带游戏注册标记:比如
users表里直接有registered_game_a、registered_game_b这样的布尔字段(TRUE表示已注册),这种结构相对少见,但也存在。
第二步:对应场景的SQL写法
针对场景1(单表存所有注册记录)
假设你要统计同时注册了game_id=1和game_id=2的用户数,有两种常用写法:
写法1:分组+HAVING筛选(推荐,逻辑清晰)
SELECT COUNT(DISTINCT user_id) AS co_registered_users FROM user_game_registrations WHERE game_id IN (1, 2) -- 只筛选这两款游戏的注册记录 GROUP BY user_id HAVING COUNT(DISTINCT game_id) = 2; -- 确保用户同时注册了两款游戏
逻辑解释:先过滤出两款游戏的所有注册数据,按用户分组后,只保留分组内包含2个不同游戏ID的用户(也就是同时注册了两款的),最后统计这些用户的数量。
写法2:自连接查询
SELECT COUNT(DISTINCT u1.user_id) AS co_registered_users FROM user_game_registrations u1 JOIN user_game_registrations u2 ON u1.user_id = u2.user_id WHERE u1.game_id = 1 AND u2.game_id = 2;
逻辑解释:把表和自己连接,找到既存在游戏1注册记录、又存在游戏2注册记录的用户,最后去重统计数量。
针对场景2(用户表带注册标记)
这种情况就简单多了,直接筛选两个标记都为真的用户:
SELECT COUNT(user_id) AS co_registered_users FROM users WHERE registered_game_a = TRUE AND registered_game_b = TRUE;
第三步:如果不确定表结构怎么办?
你可以先查看表的字段信息,不同数据库的命令略有不同:
- MySQL/MariaDB:
DESCRIBE user_game_registrations;(把表名换成你的实际表名) - PostgreSQL:
\d user_game_registrations; - SQL Server:
sp_help 'user_game_registrations';
执行这些命令后,你就能清楚看到表中有哪些字段,再对应上面的写法调整就行啦!
内容的提问来源于stack exchange,提问作者E.GibSaan
相关产品推荐
相关产品推荐

