簡體   English   中英

MySQL多行子查詢修復

[英]MySQL Multi-Row Sub Query fix

我試圖在每個用戶唯一的日期/時間之前從所有用戶返回所有數據。

我可以為每個用戶返回確切日期的所有數據,沒問題,但是我不知道如何擴展查詢以返回小於或等於關鍵日期的日期。

我有一個2表SQL數據庫。

表1-“銷售”具有所有交易的確認記錄。

  • user_id(日期,然后是各種購買信息)

表2-“ user_data”具有所有瀏覽數據的記錄

  • user_id,record_date,purchase_made(purchase_made的名稱錯誤,因為它們觸發了購買彈出窗口,但實際上可能沒有進行購買-然后是一大堆用戶操作數據)

我需要獲取所有購買用戶的所有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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM