Php MySQL-优化用户注册统计查询
有谁能告诉我一种查询注册用户统计数据的更优化方法吗?我目前缺乏创建更好查询的知识。现在它工作得很好,但我想学习更多关于做同样事情的其他方法,并对其进行改进,这样我可以扩展我对MySQL的知识,并学习其他功能Php MySQL-优化用户注册统计查询,php,mysql,Php,Mysql,有谁能告诉我一种查询注册用户统计数据的更优化方法吗?我目前缺乏创建更好查询的知识。现在它工作得很好,但我想学习更多关于做同样事情的其他方法,并对其进行改进,这样我可以扩展我对MySQL的知识,并学习其他功能 SELECT # Count users with complete profile registered current month and year ( SELECT COUNT(*) FROM users WHERE completed_registration = 1 AND
SELECT
# Count users with complete profile registered current month and year
( SELECT COUNT(*) FROM users WHERE completed_registration = 1 AND MONTH(created_at) = MONTH(CURDATE()) AND YEAR(created_at) = YEAR(CURDATE()) ) AS completed_0,
# Count users with complete profile registered 1 month ago
( SELECT COUNT(*) FROM users WHERE completed_registration = 1 AND MONTH(created_at) = MONTH(CURDATE() - INTERVAL 1 MONTH) AND YEAR(created_at) = YEAR(CURDATE() - INTERVAL 1 MONTH) ) AS completed_1,
# Count users with complete profile registered 2 months ago ( this is repeated 3 more times but for the sake of brevity is not here)
( SELECT COUNT(*) FROM users WHERE completed_registration = 1 AND MONTH(created_at) = MONTH(CURDATE() - INTERVAL 2 MONTH) AND YEAR(created_at) = YEAR(CURDATE() - INTERVAL 2 MONTH) ) AS completed_2,
# Count users with incomplete profile and verified email registered current month and year
( SELECT COUNT(*) FROM users WHERE completed_registration = 0 AND verified_email = 1 AND MONTH(created_at) = MONTH(NOW()) AND YEAR(created_at) = YEAR(NOW()) ) AS incomplete_0,
# Count users with incomplete profile and verified email registered 1 month ago
( SELECT COUNT(*) FROM users WHERE completed_registration = 0 AND verified_email = 1 AND MONTH(created_at) = MONTH(NOW() - INTERVAL 1 MONTH) AND YEAR(created_at) = YEAR(NOW()) ) AS incomplete_1,
# Count users with incomplete profile and verified email registered 2 month ago ( this is repeated 3 more times but for the sake of brevity is not here)
( SELECT COUNT(*) FROM users WHERE completed_registration = 0 AND verified_email = 1 AND MONTH(created_at) = MONTH(NOW() - INTERVAL 2 MONTH) AND YEAR(created_at) = YEAR(NOW()) ) AS incomplete_2,
# Count users with unverified email registered current month and year
( SELECT COUNT(*) FROM users WHERE verified_email = 0 AND MONTH(created_at) = MONTH(NOW()) AND YEAR(created_at) = YEAR(NOW()) ) AS unverified_0,
# Count users with unverified email registered 1 month ago
( SELECT COUNT(*) FROM users WHERE verified_email = 0 AND MONTH(created_at) = MONTH(NOW() - INTERVAL 1 MONTH) AND YEAR(created_at) = YEAR(NOW()) ) AS unverified_1,
# Count users with unverified email registered 2 month ago ( this is repeated 3 more times but for the sake of brevity is not here)
( SELECT COUNT(*) FROM users WHERE verified_email = 0 AND MONTH(created_at) = MONTH(NOW() - INTERVAL 2 MONTH) AND YEAR(created_at) = YEAR(NOW()) ) AS unverified_2,
# Count all registered users
( SELECT COUNT(*) FROM users ) AS total_users,
# Count all complete profiles
( SELECT COUNT(*) FROM users WHERE completed_registration = '1' ) AS total_registered_users,
# Count all incomplete profiles
( SELECT COUNT(*) FROM users WHERE verified_email = 1 AND completed_registration = 0 ) AS total_incomplete_users,
# Count all users with unverified email
( SELECT COUNT(*) FROM users WHERE verified_email = '0' ) AS total_unverified_users
在同一个查询中,它统计来自与用户相关的其他表的信息。例如,在另一个
SELECT
子查询中,它加入profile_type表,以统计注册为教师、口译员或翻译人员的人数。您多次点击表,难怪速度慢:
SELECT
SUM(CASE WHEN completed_registration = 1 AND MONTH(created_at) = MONTH(CURDATE()) AND YEAR(created_at) = YEAR(CURDATE()) THEN 1 ELSE 0 END) AS completed_0,
SUM(CASE WHEN completed_registration = 1 AND MONTH(created_at) = MONTH(CURDATE() - INTERVAL 1 MONTH) AND YEAR(created_at) = YEAR(CURDATE() - INTERVAL 1 MONTH) THEN 1 ELSE 0 END ) AS completed_1,
SUM(CASE WHEN completed_registration = 1 AND MONTH(created_at) = MONTH(CURDATE() - INTERVAL 2 MONTH) AND YEAR(created_at) = YEAR(CURDATE() - INTERVAL 2 MONTH) THEN 1 ELSE 0 END ) AS completed_2,
SUM(CASE WHEN completed_registration = 0 AND verified_email = 1 AND MONTH(created_at) = MONTH(NOW()) AND YEAR(created_at) = YEAR(NOW()) THEN 1 ELSE 0 END) AS incomplete_0,
SUM(CASE WHEN completed_registration = 0 AND verified_email = 1 AND MONTH(created_at) = MONTH(NOW() - INTERVAL 1 MONTH) AND YEAR(created_at) = YEAR(NOW()) THEN 1 ELSE 0 END) AS incomplete_1,
SUM(CASE WHEN completed_registration = 0 AND verified_email = 1 AND MONTH(created_at) = MONTH(NOW() - INTERVAL 2 MONTH) AND YEAR(created_at) = YEAR(NOW()) THEN 1 ELSE 0 END) AS incomplete_2,
SUM(CASE WHEN verified_email = 0 AND MONTH(created_at) = MONTH(NOW()) AND YEAR(created_at) = YEAR(NOW()) THEN 1 ELSE 0 END) AS unverified_0,
SUM(CASE WHEN verified_email = 0 AND MONTH(created_at) = MONTH(NOW() - INTERVAL 1 MONTH) AND YEAR(created_at) = YEAR(NOW()) THEN 1 ELSE 0 END) AS unverified_1,
SUM(CASE WHEN verified_email = 0 AND MONTH(created_at) = MONTH(NOW() - INTERVAL 2 MONTH) AND YEAR(created_at) = YEAR(NOW()) THEN 1 ELSE 0 END) AS unverified_2,
COUNT(*) AS total_users,
SUM(CASE WHEN completed_registration = '1' THEN 1 ELSE 0 END) AS total_registered_users,
SUM(CASE WHEN verified_email = 1 AND completed_registration = 0 THEN 1 ELSE 0 END) AS total_incomplete_users,
SUM(CASE WHEN verified_email = '0' THEN 1 ELSE 0 END ) AS total_unverified_users
FROM users
这不属于堆栈溢出,这个问题属于。明白了,我在上扩展了这个问题,以防你有时间检查。这里是扩展的谢谢@mihai!我尝试了您的解决方案,但一开始它不起作用,然后发现它必须是
SUM
而不是CASE
。请编辑答案。该死,计数在这种情况下不起作用。它必须是总和,计数还计算0