[英]Filter inner query by the results of the outer query
让我先从简单的英语开始查询:获取前 100 名付费用户和他们当前的活动项目(只有一个项目)
这是一个草拟的查询
SELECT `user_id`, SUM(p.`amount`) as `total`
FROM `users_purcahse` AS p
LEFT JOIN (SELECT `ui`.`item_id` as `item_id`, `ui`.`user_id` as `user_id`
FROM `user_items` AS `ui`
LEFT OUTER JOIN `items` AS `i` ON `ui`.`item_id` = `i`.`id`
LEFT OUTER JOIN `categories` AS `cat` ON `i`.`category_id` = `cat`.`id`
WHERE `ui`.isActive = 1
) AS `ui` ON p.`user_id` = `ui`.`user_id`
GROUP BY `user_id`, `ui`.`item_id`
ORDER BY `total` DESC
LIMIT 0, 100;
这样做的问题是内部查询正在获取所有用户项目表,然后它将与前 100 名付费用户一起加入
用户项目是一个非常大的表,查询时间太长我只想在计算后为每个用户附加当前活动项目
注意:一个用户可以有这么多项目,但只有 1 个活动项目 注意 2:在数据库级别上,user_items 可以有一个列,每个用户可以有 is_active
这是一些精心挑选的子查询的工作。
首先,让我们找出付费用户的user_id
值。
SELECT user_id, SUM(amount) total
FROM users_purcahse
ORDER BY SUM(amount) DESC
LIMIT 100
接下来,让我们为您的用户查找item_id
值。 如果不止一项处于活动状态,我们将采用item_id
值最小的一项来获得一项。
SELECT user_id, MIN(item_id) item_id
FROM user_items
WHERE isActive = 1
GROUP BY user_id
然后,在外部查询中,我们可以获取您的项目的详细信息。
SELECT top_users.user_id, top_users.total,
active_items.item_id,
items.*, categories.*
FROM (
SELECT user_id, SUM(amount) total
FROM users_purcahse
ORDER BY SUM(amount) DESC
LIMIT 100
) top_users
LEFT JOIN (
SELECT user_id, MIN(item_id) item_id
FROM user_items
WHERE isActive = 1
GROUP BY user_id
) active_items ON top_users.user_id = active_items.user_id
LEFT JOIN items ON active_items.item_id = item.id
LEFT JOIN categories ON item.category_id = categories.id
ORDER BY top_users.total DESC, top_users.user_id
这里的技巧是使用 GROUP BY 子查询来获取每个user_id
只需要一个值的数据项。
获得所需的结果集后,您可以使用EXPLAIN
来帮助您解决任何性能问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.