[英]Get data where MAX(date) < X
我有兩個表與一對多的關系。
Table1
ID name email
Table2
ID table1_ID date
我需要從Table1獲取所有數據, where
:
MAX(date) from Table2 < "2016-01-01"
這不起作用。 在where子句中,Max被視為“無效”。 我做的是:
SELECT Table1.name, Table1.email, tmp.maxdate
FROM Table1
JOIN ( SELECT MAX(date) maxdate, table1_ID
FROM Table2
GROUP BY table1_ID ) as tmp
ON tmp.table1_ID = table1.id
WHERE tmp.maxdate < "2016-01-01"
AND (other conditions)
這樣可行。 但我認為性能會很糟糕 - explain
說明正在閱讀所有Table2
,這個表會增長很多。
我不知道如何做到這一點,或者如何提高我當前的查詢性能?
嘗試:
SELECT Table1.name, Table1.email, tmp.maxdate
FROM Table1
INNER JOIN ( SELECT MAX(date) maxdate, table1_ID
FROM Table2
GROUP BY table1_ID
HAVING maxdate > "2016-01-01" ) as tmp
ON tmp.table1_ID = table1.id
WHERE
AND (other conditions)
在此之前,您只需將Table2中的所有人帶回來並與Table1一起加入。 這將擊敗所有沒有maxdate>“2016-01-01”的人,並使用Table1加入它。
首先,不要想,自己測試並檢查它。
其次,您可以嘗試使用EXISTS()
,這可能會稍快一些,因為您可以過濾Table2而不使用GROUP BY
子句:
SELECT * FROM Table1 t1
WHERE EXISTS(SELECT 1 FROM Table2 t2
WHERE t2.date > "2016-01-01"
AND t1.id = t2.table1_id
AND <Other Conditions>)
您還可以在子查詢中添加table2.date > "2016-01-01"
。
另外,請考慮添加以下索引:
Table1(id,name,email)
Table2(table1_id,date)
請注意,我建議這些索引基於您提供的查詢,如果有額外條件,則此索引可能不完整。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.