修复SQL查询,使其更加高效

时间:2013-07-31 17:23:28

标签: mysql sql

我有3张桌子:

  1. mobile_users - idphone_type,...
  2. 2 + 3。 iphone_purchasesandroid_purchases - idstatususer_id,..

    我正在尝试让所有购买2次或更多次的用户。 成功购买由status > 0标识。 另外,我想在同一查询中获取mobile_users表中的用户总数。

    这是我提出的查询:

    SELECT COUNT(*) AS `users`,
           ( SELECT COUNT(*) 
               FROM `mobile_users`
           ) AS `total`
      FROM `mobile_users` 
     WHERE `mobile_users`.`phone_type` = 'iphone'
       AND ( SELECT COUNT(*) 
               FROM ( SELECT `status`,
                             `user_id` 
                        FROM `iphone_purchases`
                      UNION
                      SELECT `status`,
                             `user_id` 
                        FROM `android_purchases`
                    ) AS `purchase_list` 
              WHERE `purchase_list`.`status` > 0 
                AND `purchase_list`.`user_id` = `mobile_users`.`id`
           ) >= 2
    

    这很慢,我必须找到一种方法来改善它。 任何帮助将不胜感激!

    编辑: 此外,您应该考虑我正在使用PHP中的子查询构建此查询。 我正在使用WHERE语句中的更多条件构建它。

1 个答案:

答案 0 :(得分:3)

您的查询只是返回用户数,而不是每个用户。

以下重构您的查询。它分别计算iphone和机器人的购买次数,然后使用left outer join将它们组合在一起。 where子句只包含计数:

select mu.*, i.cnt as iphones, a.cnt as androids
from mobile_users mu left outer join
     (SELECT `user_id`, count(*) as cnt
      FROM `iphone_purchases`
      where `status` > 0
      group by user_id
     ) i
     on i.user_id = mu.id left outer join
     (SELECT `user_id`, count(*) as cnt
      FROM `android_purchases`
      where `status` > 0
      group by user_id
     ) a
     on a.user_id = mu.id
where coalesce(i.cnt, 0) + coalesce(a.cnt, 0) >= 2;