[英]MySQL - Optimise user registration statistics query
任何人都可以指導我以一種更優化的方式來查詢注冊用戶的統計信息嗎?我目前還不具備創建更好查詢的知識。 現在它可以正常工作,但是我想學習更多有關做同一件事並改進它的其他方法,這樣我就可以擴展對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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.