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