Details
Can anyone instruct me on a more optimised way of querying this statistics of registered users? I currently lack the knowledge to create a better query. Right now it works fine, but I want to learn more about other ways to do the same thing and improve on it, this way I can expand my knowledge on MySQL, and study on other functions.
Also, I'm doing everything in a single query, would it better to split it into more focused queries?
QUERY
SELECT
# Count users with complete profile registered current month and year
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,
# Count users with complete profile registered 1 month ago
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,
# Count users with incomplete profile and verified email registered current month and year
SUM(CASE WHEN completed_registration = 0 AND verified_email = 1 AND MONTH(created_at) = MONTH(CURDATE()) AND YEAR(created_at) = YEAR(CURDATE()) THEN 1 ELSE 0 END) AS incomplete_0,
# Count users with incomplete profile and verified email registered 1 month ago
SUM(CASE WHEN completed_registration = 0 AND verified_email = 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 incomplete_1,
# Count users with unverified email registered current month and year
SUM(CASE WHEN verified_email = 0 AND MONTH(created_at) = MONTH(CURDATE()) AND YEAR(created_at) = YEAR(CURDATE()) THEN 1 ELSE 0 END) AS unverified_0,
# Count users with unverified email registered 1 month ago
SUM(CASE WHEN verified_email = 0 AND MONTH(created_at) = MONTH(CURDATE() - INTERVAL 1 MONTH) AND YEAR(created_at) = YEAR(CURDATE() - INTERVAL 1 MONTH) THEN 1 ELSE 0 END) AS unverified_1,
# Count total users registered as Onsite Teacher this month
( SELECT COUNT(*) FROM onsite_teachers WHERE MONTH(created_at) = MONTH(CURDATE()) AND YEAR(created_at) = YEAR(CURDATE()) ) AS onsite_teachers_0,
# Count total users registered as Onsite Teacher last month
( SELECT COUNT(*) FROM onsite_teachers WHERE MONTH(created_at) = MONTH(CURDATE() - INTERVAL 1 MONTH) AND YEAR(created_at) = YEAR(CURDATE() - INTERVAL 1 MONTH) ) AS onsite_teachers_1,
# Count how many Onsite Teachers have been hired this month
( SELECT COUNT(*) FROM purchases INNER JOIN purchased_profiles ON purchased_profiles.purchase_id = purchases.id AND purchased_profiles.profile_type = 'onsite_teacher' AND purchases.transaction_status = 'completed' AND MONTH(purchases.created_at) = MONTH(NOW()) AND YEAR(purchases.created_at) = YEAR(NOW()) ) AS current_month_purchased_onsite_teachers,
# Count total users registered as Translator this month
( SELECT COUNT(*) FROM translators WHERE MONTH(created_at) = MONTH(CURDATE()) AND YEAR(created_at) = YEAR(CURDATE()) ) AS translators_0,
# Count total users registered as Translator last month
( SELECT COUNT(*) FROM translators WHERE MONTH(created_at) = MONTH(CURDATE() - INTERVAL 1 MONTH) AND YEAR(created_at) = YEAR(CURDATE() - INTERVAL 1 MONTH) ) AS translators_1,
# Count how many Translators have been hired this month
( SELECT COUNT(*) FROM purchases INNER JOIN purchased_profiles ON purchased_profiles.purchase_id = purchases.id AND purchased_profiles.profile_type = 'translator' AND purchases.transaction_status = 'completed' AND MONTH(purchases.created_at) = MONTH(NOW()) AND YEAR(purchases.created_at) = YEAR(NOW()) ) AS current_month_purchased_translators,
# Count total users registered as Interpreter this month
( SELECT COUNT(*) FROM interpreters WHERE MONTH(created_at) = MONTH(CURDATE()) AND YEAR(created_at) = YEAR(CURDATE()) ) AS interpreters_0,
# Count total users registered as Interpreter last month
( SELECT COUNT(*) FROM interpreters WHERE MONTH(created_at) = MONTH(CURDATE() - INTERVAL 1 MONTH) AND YEAR(created_at) = YEAR(CURDATE() - INTERVAL 1 MONTH) ) AS interpreters_1,
# Count how many Interpreters have been hired this month
( SELECT COUNT(*) FROM purchases INNER JOIN purchased_profiles ON purchased_profiles.purchase_id = purchases.id AND purchased_profiles.profile_type = 'interpreter' AND purchases.transaction_status = 'completed' AND MONTH(purchases.created_at) = MONTH(NOW()) AND YEAR(purchases.created_at) = YEAR(NOW()) ) AS current_month_purchased_interpreters,
# Count all registered users
COUNT(*) AS total_users,
# Count all registered clients
( SELECT COUNT(*) FROM clients ) AS total_clients,
# Sum all completed sales totals
( SELECT SUM(purchase_total) FROM purchases WHERE transaction_status = 'completed' ) AS total_profits,
# Count all completed sales
( SELECT COUNT(*) FROM purchases WHERE transaction_status = 'completed' ) AS total_sales,
# Count all complete profiles
SUM(CASE WHEN completed_registration = 1 THEN 1 ELSE 0 END) AS total_registered_users,
# Count all incomplete profiles
SUM(CASE WHEN verified_email = 1 AND completed_registration = 0 THEN 1 ELSE 0 END) AS total_incomplete_users,
# Count all users with unverified email
SUM(CASE WHEN verified_email = 0 THEN 1 ELSE 0 END) AS total_unverified_users,
# Sum current month completed sales total
( SELECT SUM(purchase_total) FROM purchases WHERE transaction_status = 'completed' AND MONTH(created_at) = MONTH(CURDATE()) AND YEAR(created_at) = YEAR(CURDATE()) ) AS profits_0,
# Sum last month completed sales total
( SELECT SUM(purchase_total) FROM purchases WHERE transaction_status = 'completed' AND MONTH(created_at) = MONTH(CURDATE() - INTERVAL 1 MONTH) AND YEAR(created_at) = YEAR(CURDATE() - INTERVAL 1 MONTH) ) AS profits_1
FROM
users
#Comments\$\endgroup\$