简体   繁体   中英

MySQL two SELECTS with different conditions in one query

I've looked through the other questions of similar nature without finding a solution.

I have a query that gets SUM data for males and then for females in a signup process. It's targeting the same data in two tables just with a different condition. How can these two be joined into one?

Here's the query for males:

SELECT 
    SUM(signup_data.submited) AS SubmitedMales,
    SUM(signup_data.approved) AS ApprovedMales,
FROM `signup_data`
    LEFT JOIN users ON signup_data.user_id = users.user_id
    WHERE users.sex = 'male'

The query for females:

SELECT 
    SUM(signup_data.submited) AS SubmitedFemales,
    SUM(signup_data.approved) AS ApprovedFemales,
FROM `signup_data`
    LEFT JOIN users ON signup_data.user_id = users.user_id
    WHERE users.sex = 'female'";

Thanks!

You should rather use a conditional SUM() using CASE expression like

SUM(case when users.sex = 'male' then signup_data.submited end) AS SubmitedMales,

Your query should be

SELECT 
    SUM(case when users.sex = 'male' then signup_data.submited end) AS SubmitedMales,
    SUM(case when users.sex = 'male' then signup_data.approved end) AS ApprovedMales,
    SUM(case when users.sex = 'female' then signup_data.submited end) AS SubmitedFemales,
    SUM(case when users.sex = 'female' then signup_data.approved end) AS ApprovedFemales,
FROM `signup_data`
    LEFT JOIN users ON signup_data.user_id = users.user_id

You can use conditional aggregation using case inside the aggregate function:

SELECT 
    SUM(case when users.sex = 'female' then signup_data.submited else 0 end) AS SubmitedFemales,
    SUM(case when users.sex = 'female' then signup_data.approved else 0 end) AS ApprovedFemales,
    SUM(case when users.sex = 'male' then signup_data.submited else 0 end) AS SubmitedMales,
    SUM(case when users.sex = 'male' then signup_data.approved else 0 end) AS ApprovedMales
FROM `signup_data`
    LEFT JOIN users ON signup_data.user_id = users.user_id;
SELECT * FROM

(SELECT 
    SUM(signup_data.submited) AS SubmitedMales,
    SUM(signup_data.approved) AS ApprovedMales,
FROM `signup_data`
    LEFT JOIN users ON signup_data.user_id = users.user_id
    WHERE users.sex = 'male') AS T1

(SELECT 
    SUM(signup_data.submited) AS SubmitedFemales,
    SUM(signup_data.approved) AS ApprovedFemales,
FROM `signup_data`
    LEFT JOIN users ON signup_data.user_id = users.user_id
    WHERE users.sex = 'female') AS T2

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM