如何组合这三个SQL查询?

时间:2012-12-01 07:22:21

标签: mysql sql

我有三个SQL查询:

第一次查询:

SELECT DISTINCT     company.company_name AS CompanyName, pts AS CompanyPts
FROM                users_pts, users_codes, company
WHERE               scanned = 1 
AND                 users_codes.company_id = company.company_id 
AND                 users_codes.company_id = users_pts.company_id 
AND                 users_codes.email = 'test@gmail.com'
GROUP BY            company.company_id

第二次查询:

SELECT SUM(IF(completed = 0, 1, 0)) AS NumberOfSurveys 
FROM users_survey_answers
WHERE users_survey_answers.email = 'test@gmail.com'
GROUP BY users_survey_answers.company_id

第三次质询:

SELECT SUM(IF(redeemed = 0, 1, 0)) AS NumberOfRewards
FROM users_rewards
WHERE users_rewards.email = 'test@gmail.com'
GROUP BY users_rewards.company_id

电子邮件列位于所有数据库中,因此请不要担心从何处获取。 (无论是users_rewards.email还是users_survey_answers.email,都没关系)

我需要帮助才能开始。

谢谢你们

1 个答案:

答案 0 :(得分:2)

可以使用子查询

完成
select distinct
    c.company_name as CompanyName, pts as CompanyPts,
    (
        select sum(if(usa.completed = 0, 1, 0))
        from users_survey_answers as usa
        where
            usa.email = uc.email and
            usa.company_id = uc.company_id
    ) as NumberOfSurveys,
    (
        select sum(if(ur.completed = 0, 1, 0))
        from users_rewards as ur
        where
            ur.email = uc.email and
            ur.company_id = uc.company_id
    ) as NumberOfRewards
from users_pts as upusers_codes as uc, company as c
where
    scanned = 1 and
    uc.company_id = c.company_id and
    uc.company_id = up.company_id and
    uc.email = 'test@gmail.com'

也可以使用连接

来实现
select distinct
    c.company_name as CompanyName, pts as CompanyPts,
    ifnull(usa.NumberOfSurveys, 0) as NumberOfSurveys,
    ifnull(ur.NumberOfRewards, 0) as NumberOfRewards
from company as c
    inner join users_codes as uc on uc.company_id = c.company_id
    inner join users_pts as up on up.company_id = c.company_id
    left outer join
    (
        select
            t.email, t.company_id,
            sum(if(t.completed = 0, 1, 0)) as NumberOfSurveys 
        from users_survey_answers as t
        group by t.email, t.company_id
    ) as usa on usa.email = uc.email and usa.company_id = uc.company_id
    left outer join
    (
        select
            t.email, t.company_id,
            sum(if(t.redeemed = 0, 1, 0)) as NumberOfRewards
        from users_rewards as t
        group by t.email, t.company_id
    ) as ur on ur.email = uc.email and ur.company_id = uc.company_id
where
    scanned = 1 and
    uc.email = 'test@gmail.com'