🧮

[MySQL] 相関サブクエリ

サブクエリの一種。サブクエリが外部クエリに現れるテーブルを参照するようなサブクエリのこと。

たとえば記事に紐づけられたタグのうち、最後に紐づけられたものを知りたいとき、相関サブクエリを使うとこうなる。

SELECT * FROM posts p1
INNER JOIN post_tag pt1 ON pt1.post_id = p1.id
WHERE NOT EXISTS(
	SELECT * FROM posts p2 INNER JOIN post_tag pt2 ON pt2.post_id = p2.id
	// 同じ記事に紐づけられたタグのうち
	WHERE pt1.post_id = pt2.post_id
	// よりあたらしい紐づけが存在しないものが最後に紐づけられたもの
	AND pt1.created_at < pt2.created_at
)

NOT EXISTS 内のクエリがすべての行に対して実行されるので、パフォーマンスは高くない。 相関サブクエリを使わずに書いたほうが速い。以下はサブクエリの結果を導出テーブルとして使う例。

SELECT * FROM posts p1
INNER JOIN post_tag pt1 ON pt1.post_id = p1.id
INNER JOIN (
	SELECT post_id, MAX(published_at) as latest FROM post_tag
	GROUP BY post_id
) AS pt2 ON pt2.post_id = pt1.post_id AND pt2.latest = pt1.published_at;

あえて計算コストの高い相関サブクエリを使わないとできないことがあるのだろうか 🤔