@Bill Karwinによるこの優れた回答をしばらく前に読みました。
https://stackoverflow.com/a/1313293/317889
これはほとんど質問に答えますが、最近クエリを更新して、結合されたテーブルのステータスをフィルタリングする必要がありました。
上記の投稿のクエリと同様に、以下に 2 つのクエリを書きました。遅いクエリである最初のクエリは、結合されたテーブルのステータス フィルタリングで動作します。
SELECT m.*, t1.* FROM mood m
LEFT JOIN temper t ON ( m._id = t.mood_id )
WHERE grantee_username = "username"
AND m.status_id != 1 // NOT INTERESTED IN THIS FILTER
AND t.status_id != 1 // FILTERING
GROUP BY m._id;
2 番目のクエリでは、フィルタリングを追加して上記のように機能させる方法がわかりません。
SELECT m.*, t1.* FROM mood m
LEFT JOIN temper t1 ON ( m._id = t1.mood_id )
LEFT JOIN temper t2 ON ( t1.mood_id = t2.mood_id AND t1._id < t2._id )
WHERE t2._id IS NULL
AND m.grantee_username = "username"
AND m.status_id != 1; // NOT INTERESTED IN THIS FILTER
最初のクエリは完全に機能しますが、2 番目のクエリよりも遅いと見なされます。
2 番目のクエリは、すべてのムード レコードを関連するラスト テンパー レコードに戻すときに機能しますが、ラスト テンパー レコードのステータスが 1 になっている可能性がありますが、これは望ましくありません。
どんな洞察も興味深いでしょう。t.status_id
いつでも最初のクエリを使用できますが、パフォーマンスのために、可能であれば 2 番目のクエリにフィルタリングを追加する方法を見つけたいと思います。