我有3张桌子:
mobile_users
- id
,phone_type
,... 2 + 3。 iphone_purchases
和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语句中的更多条件构建它。
答案 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;