簡體   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