-1

私は3つのテーブルを持っています:

  1. mobile_users- id、、phone_type...

2+3。iphone_purchasesAND android_purchases- id、、、.. status_user_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 ステートメントにさらに条件を付けて構築しています。

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 に答える