Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQLite:如何优化联合查询_Sql_Sqlite_Query Optimization - Fatal编程技术网

SQLite:如何优化联合查询

SQLite:如何优化联合查询,sql,sqlite,query-optimization,Sql,Sqlite,Query Optimization,在下面的联合查询中,子查询#2和#4是相同的,我希望避免两次获取相同的数据。据我所知,有些数据库允许您在查询的开头编写WITH子句,但SQLite不支持它。所以问题是如何优化下面的查询 SELECT disliked, recommended, weight FROM (SELECT movie_id * 10 AS disliked FROM ratings WHERE rating IN (1,2) AND user_id = #{id}

在下面的联合查询中,子查询#2和#4是相同的,我希望避免两次获取相同的数据。据我所知,有些数据库允许您在查询的开头编写
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

我不完全确定我读得这么快,但可能是这样的:

 SELECT
     10*r1.movie_id+(r1.rating IN (4,5)) AS likedisliked,
     r2.movie_id AS recommended,
     r2.rating AS weight
 FROM ratings AS r1, ratings AS r2 
 WHERE r1.user_id=#{id} AND r2.user_id=#{id}
       AND r1.rating IN (1,2,4,5) AND r2.rating IN (4,5)
       AND r1.movie_id!=r2.movie_id;