問題出在一個(gè)假設(shè)的線上商店;我將簡(jiǎn)化我的特定問題的數(shù)據(jù)。
假設(shè)有兩個(gè)表格:一個(gè)儲(chǔ)存每位客戶的註冊(cè)日期
CREATE TABLE customers ( customerID int, register DATE, );
,第二個(gè)保存客戶的所有線上訪問
CREATE TABLE visits ( customerID int, visit DATE, );
對(duì)於每個(gè)用戶,我希望找到用戶在註冊(cè)後 7 天內(nèi)訪問線上商店的最後一天,以最有效的方式。 如果用戶註冊(cè)後未造訪過商店,我應(yīng)該在註冊(cè)後 7 天內(nèi)返回 NULL 作為最後造訪日期。
我當(dāng)然可以LEFT JOIN客戶透過客戶ID進(jìn)行訪問,並將訪問日期過濾為註冊(cè)日之間 和加七,最後得到每個(gè)客戶的最大日期。 然而,初始連接會(huì)產(chǎn)生一個(gè)巨大的表,我想避免這種計(jì)算成本高昂的操作。
非常感謝您的想法!
這可能是最有效的:
SELECT c.customerID, c.register, ( SELECT MAX(v.visit) FROM visits AS v WHERE v.customerID = c.customerID AND v.visit < c.register + INTERVAL 7 DAY ) AS last_date FROM customers AS c;
索引:
customers: PRIMARY KEY(customerId) -- is this what you have? visits: INDEX(customerID, visit) -- or perhaps PRIMARY KEY
您對(duì)「計(jì)算成本高昂的操作」的擔(dān)憂:
訪問
索引是“覆蓋”,因此它只查看索引。