2016-11-15 34 views
0

我試圖在每個用戶唯一的日期/時間之前返回所有用戶的所有數據。MySQL多行子查詢修復程序

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

我有一個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」爲「< =」但我可以」用一個返回多於一行的子查詢來做到這一點。

免責聲明 - 我沒有寫的數據庫,我沒有權限更改數據庫(我也不會是這樣做的正確的人)

免責聲明2 - 我知道,使用purchase_made會略微增加結果,因爲不是所有這些都是購買。但由於報告的原因,銷售表的日期可能會有足夠的時間,因此實際上LESS的可靠性低於使用與purchase_made相關的時間戳(通過在實際數據集上運行的廣泛查詢比較得到驗證)。但是,上面的任務是沒關係,他們會對「大部分」準確而感到滿意。

回答

0

「現在我真正想要的是能夠改變的是第二個‘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) 

我懷疑銷售表變得越來越大,並在將性能隨着時間的推移,那裏的存在可以提前存在導致子查詢性能得到提高。

+0

我對剛剛發生的事情瞭解甚少。但我想我喜歡它。我非常肯定,這個工作非常完美,你給了我一些研究的東西。謝謝Q! – Dulock

+0

@杜洛克提問如果你不明白。如果這是你必須維護的東西,或者你正在開發工作,那麼這種概念的知識將幫助你! – xQbert