-2

我有一个快速的问题...

我想将两个 sql 查询合并为一个,但问题是这两个查询都包含 GROUP BY。

查询一:

SELECT   COUNT(users_survey_answers.ultimate_survey_code)
FROM     company,
         users_codes,
         users_survey_answers
WHERE    company.company_id = users_codes.company_id
  AND    users_codes.email = "test@gmail.com"
  AND    users_codes.company_id = users_survey_answers.company_id
  AND    users_survey_answers.completed = 0
GROUP BY users_codes.company_id

查询 2:

SELECT   COUNT(users_rewards.reward_id)
FROM     company, 
         users_codes, 
         users_rewards
WHERE    company.company_id = users_codes.company_id
  AND    users_codes.email = "test@gmail.com"
  AND    users_rewards.company_id = users_codes.company_id
  AND    redeemed = 0
GROUP BY users_codes.company_id

我很感激帮助。我尝试了很多解决方案,仍然没有帮助。

谢谢。

4

2 回答 2

1

我冒昧地添加company_id到选择中。如果您事后无法知道哪个结果属于哪个公司,那么按 company_id 分组有什么好处。:)

select
  company_id,
  sum(code_count) as code_count,
  sum(reward_count) as reward_count
FROM
    (SELECT   
       users_codes.company_id,
       COUNT(users_survey_answers.ultimate_survey_code) as code_count,
       null as reward_count
    FROM     company,
             users_codes,
             users_survey_answers
    WHERE    company.company_id = users_codes.company_id
      AND    users_codes.email = "test@gmail.com"
      AND    users_codes.company_id = users_survey_answers.company_id
      AND    users_survey_answers.completed = 0
    GROUP BY users_codes.company_id
    UNION ALL
    SELECT   
      users_codes.company_id,
      COUNT(users_rewards.reward_id) as reward_count,
      null
    FROM     company, 
             users_codes, 
             users_rewards
    WHERE    company.company_id = users_codes.company_id
      AND    users_codes.email = "test@gmail.com"
      AND    users_rewards.company_id = users_codes.company_id
      AND    redeemed = 0
    GROUP BY users_codes.company_id) x
GROUP BY 
  company_id

太麻烦了。你可以这样写。我还冒昧地引入了更现代INNER JOIN的混叠技术,但随时可以恢复。

SELECT
  c.company_id,
  (SELECT COUNT(ultimate_survey_code)
  FROM
    users_survey_answers a
  WHERE
    a.completed = 0 AND
    a.company_id = c.company_id) as answer_count,
  (SELECT COUNT(ultimate_survey_code)
  FROM
    users_rewards r
  WHERE
    r.redeemed = 0 AND
    r.company_id = c.company_id) as reward_count
FROM
  company c
  INNER JOIN users_code uc ON uc.company_id = c.company_id
WHERE
  uc.email = "test@gmail.com"
GROUP BY
  c.company_id
于 2012-11-30T01:19:45.170 回答
1

试试这个:

SELECT    company.company_id,
          users_pts.pts as CompanyPts,
          t1.ultimate_survey_code_count,
          t2.reward_id_count
FROM      company,
          users_codes
INNER JOIN (
          SELECT 
              company_id, 
              COUNT(ultimate_survey_code) AS ultimate_survey_code_count
          FROM users_survey_answers
          WHERE completed = 0
          GROUP BY company_id
          ) AS t1
       ON users_codes.company_id = t1.company_id
INNER JOIN (
          SELECT 
              company_id, 
              SUM(IF(redeemed = 0, 1, 0)) AS reward_redeem_zero_count,
              SUM(IF(redeemed = 0, 0, 1)) AS reward_redeem_not_zero_count
          FROM users_rewards
          GROUP BY company_id
          ) AS t2
       ON users_codes.company_id = t2.company_id
INNER JOIN users_pts
       ON users_codes.company_id = users_pts.company_id
WHERE     company.company_id = users_codes.company_id
  AND     users_codes.email = "test@gmail.com"

这是未经测试的,但希望能满足您的需求。

于 2012-11-30T01:31:48.227 回答