には1対多の関係を持つ2つのテーブルがあります。MAX(date)<X
Table1
ID name email
Table2
ID table1_ID date
私は表1 where
からすべてのデータを取得する必要があります。
MAX(date) from Table2 < "2016-01-01"
これは動作しません。 Maxは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にtmpを結合する中間ステップを含めるのではなく、テーブル1にtmpに参加するのはちょっと奇妙です。また、WHERE句をサブクエリに配置します。それ以外にも、索引付けされているので、このクエリは慌てて速くなるはずです。 – Strawberry
'MAX(date)'は集約であるため、 'WHERE'に入れることはできませんが、代わりに' HAVING'に属します。とにかく、他の人が指摘しているように、 'MAX(HAVING MAX) 'の代わりに' 2016-01-01'を使うと、 'WHERE date> '2016-01-01'を使うことができます。 –