获取MAX(日期)< X

时间:2016-08-08 14:25:35

标签: mysql sql database query-optimization

我有两个表与一对多的关系。

Table1
ID name email
Table2
ID table1_ID date

我需要从Table1 where获取所有数据:

MAX(date) from Table2 < "2016-01-01"

这不起作用。 Max被视为&#34;无效&#34;在where子句中。我做的是:

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,这个表会增长很多。

有关我如何能够做到这一点的任何想法,或者如何提高我当前的查询性能?

2 个答案:

答案 0 :(得分:2)

尝试:

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&gt;这将会淘汰所有人&#34; 2016年1月1日&#34;并使用Table1加入它。

答案 1 :(得分:1)

首先,不要认为,测试你自己并检查它。

其次,您可以尝试使用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)

请注意,我建议根据您提供的查询推荐这些索引,如果有额外条件,则此索引可能不完整。