Php 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

有谁能告诉我一种查询注册用户统计数据的更优化方法吗?我目前缺乏创建更好查询的知识。现在它工作得很好,但我想学习更多关于做同样事情的其他方法,并对其进行改进,这样我可以扩展我对MySQL的知识,并学习其他功能

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