如何从多张不同数据表中获取在线用户数及对应表名?
解决多表统计在线用户数并关联表名的问题
看来你是想从多个结构相似的users_*表中统计online=1的用户数量,还要把统计结果和对应表名对应起来对吧?你当前的SQL语句逻辑有问题,因为子查询只返回了表名,并没有实际去查询每个表的用户数据,所以没法得到预期的结果。咱们来一步步解决这个问题:
方法一:手动拼接(表数量少的情况)
如果你的users_*表数量不多,可以直接为每个表单独编写统计语句,然后用UNION ALL合并结果集,这样就能得到你想要的格式:
SELECT COUNT(*) AS online, 'users_1' AS `table` FROM users_1 WHERE online = 1 UNION ALL SELECT COUNT(*) AS online, 'users_2' AS `table` FROM users_2 WHERE online = 1 UNION ALL SELECT COUNT(*) AS online, 'users_3' AS `table` FROM users_3 WHERE online = 1;
这个语句会分别统计每个表的在线用户数,同时手动指定对应的表名,最后合并成一个统一的结果,完全符合你预期的输出格式。
方法二:动态SQL(表数量多的情况)
如果有很多个users_*表,手动写每个表的语句太麻烦,可以用动态SQL自动生成统计语句。下面以MySQL为例,展示如何实现:
-- 初始化变量存储动态SQL语句 SET @sql = NULL; -- 自动生成所有users_*表的统计语句,并用UNION ALL连接 SELECT GROUP_CONCAT( CONCAT( 'SELECT COUNT(*) AS online, ''', table_name, ''' AS `table` FROM ', table_name, ' WHERE online = 1' ) SEPARATOR ' UNION ALL ' ) INTO @sql FROM information_schema.tables WHERE table_name LIKE 'users_%'; -- 匹配所有users_开头的表 -- 执行动态生成的SQL PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
这段代码会从information_schema.tables中自动获取所有以users_开头的表名,然后为每个表生成对应的统计语句,最后合并执行,不管你有多少个users_*表,都能自动完成统计。
为什么你的原SQL不行?
你的原语句SELECT count(online) FROM (SELECT UserTableName FROM name) WHERE online = 1逻辑不通:子查询只返回了表名列表,但并没有去这些表中查询实际的用户数据,自然无法统计每个表的在线用户数。我们需要针对每个表单独执行统计,再合并结果,这才是正确的思路。
内容的提问来源于stack exchange,提问作者Green
相关产品推荐
相关产品推荐

