-1

我有 3 张桌子:

  1. mobile_users- 与id, phone_type,...

2+3。iphone_purchasesandroid_purchases- 与id, status, user_id,..

我试图让所有购买了 2 次或更多的用户。成功购买由 标识status > 0mobile_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 语句的更多条件来构建它。

4

1 回答 1

3

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

以下内容将重组您的查询。它分别计算 iphone 和 android 的购买次数,然后使用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;
于 2013-07-31T17:42:16.540 回答