我有两个表与一对多的关系。
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
,这个表会增长很多。
有关我如何能够做到这一点的任何想法,或者如何提高我当前的查询性能?
答案 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)
请注意,我建议根据您提供的查询推荐这些索引,如果有额外条件,则此索引可能不完整。