繁体   English   中英

根据外部查询的结果过滤内部查询

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM