以下のUNIONクエリでは、サブクエリ#2と#4は同一であり、同じデータを2回フェッチすることは避けたいと思います。私の知る限り、一部のデータベースWITH
ではクエリの先頭に句を記述できますが、SQLiteはそれをサポートしていません。したがって、問題は、以下のクエリを最適化する方法です。
SELECT disliked, recommended, weight
FROM
(SELECT movie_id * 10 AS disliked
FROM ratings
WHERE rating IN (1,2)
AND user_id = #{id}
) AS input,
(SELECT movie_id AS recommended, rating AS weight
FROM ratings
WHERE rating IN (4,5)
AND user_id = #{id}
) AS output
UNION
SELECT liked, recommended, weight
FROM
(SELECT movie_id, movie_id * 10 + 1 AS liked
FROM ratings
WHERE rating IN (4,5)
AND user_id = #{id}
) AS input,
(SELECT movie_id AS recommended, rating AS weight
FROM ratings
WHERE rating IN (4,5)
AND user_id = #{id}
) AS output
WHERE input.movie_id != recommended