[英]MySQL Multi-Row Sub Query fix
我試圖在每個用戶唯一的日期/時間之前從所有用戶返回所有數據。
我可以為每個用戶返回確切日期的所有數據,沒問題,但是我不知道如何擴展查詢以返回小於或等於關鍵日期的日期。
我有一個2表SQL數據庫。
表1-“銷售”具有所有交易的確認記錄。
表2-“ user_data”具有所有瀏覽數據的記錄
我需要獲取所有購買用戶的所有user_data記錄,包括首次購買之前(包括首次購買)。
為了獲得確切的購買記錄,我可以使用以下方法:
SELECT *
FROM user_data
WHERE user_id IN (SELECT user_id FROM sales)
AND record_date IN (SELECT min(record_date) FROM user_data WHERE purchase_made = 1 GROUP BY user_id);
現在,我真正想要的就是能夠將第二個“ IN”更改為“ <=”,但是我無法通過返回多於1行的子查詢來實現。
免責聲明-我沒有寫數據庫,我沒有更改數據庫的權限(我也不適合這樣做)
免責聲明2-我知道使用purchase_made會使結果有些混亂,因為並非所有這些都是購買。 但是由於有報表,銷售表中的日期可能要花足夠長的時間才能比使用與purchase_made關聯的時間戳(實際上是通過對實際數據集進行的大量查詢比較證明)可靠得多。 但是從上面的要求是,這並不重要,他們會對“大部分”的准確性感到滿意。
“現在,我真正想要的是能夠將第二個“ IN”更改為“ <=
因此,通過關聯記錄使其成為關聯的子查詢,我們不再需要“ IN”,現在可以使用<=
SELECT *
FROM user_data UD
WHERE user_id IN (SELECT user_id FROM sales)
AND record_date <= (SELECT MIN(record_date)
FROM user_data UD2
WHERE UD2.purchase_made = 1
AND UD2.User_ID = UD.User_ID);
另一種方法是將user_Id添加到子查詢中,而不是使子查詢成為您基於user_ID加入的內聯視圖,然后根據加入條件比較日期。
SELECT *
FROM
user_data UD
INNER JOIN
(SELECT MIN(record_date) mrd, User_ID
FROM user_data
WHERE purchase_made = 1
GROUP BY User_ID) UD2 ON UD.user_Id = UD2.user_Id
AND UD.record_date <= UD2.RecordDate
WHERE
user_id IN (SELECT user_id FROM sales)
我會考慮將where子句更改為...
WHERE
user_ID EXISTS (SELECT NULL FROM sales S WHERE S.user_ID = UD.user_ID)
我懷疑sales表會越來越大,並且IN會隨着時間的推移而降低性能,因為子查詢早就存在,從而導致性能提高。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.