簡體   English   中英

獲取MAX(日期)<X的數據

[英]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.

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