SQLite:你会如何改写查询?

时间:2017-06-06 20:23:44

标签: sql sqlite

我创建了一个基本的电影数据库,为此我正在使用SQLite。

我有一张桌子,看起来像这样:

CREATE TABLE movie_collection ( 
    user_id INTEGER NOT NULL, 
    movie_id INTEGER NOT NULL, 
    PRIMARY KEY (user_id, movie_id), 
    FOREIGN KEY (user_id) REFERENCES user (id), 
    FOREIGN KEY (movie_id) REFERENCES movie (id) 
)

作为一个简单的任务,我想向一个用户(比如说user_id = 1)显示整个电影集,其中实际用户(user_id = 1)可能有也可能没有一些电影采集。我还必须阻止多个结果集,其中多个用户在其集合中具有相同的电影记录,特别是如果这涉及实际用户(user_id = 1)然后他具有优先级,如果有让我们说3条记录如下:

user_id   movie_id
--------  ---------
  1          17
  5          17
  8          17

然后结果集必须有记录(1,17)而不是其他两个。

对于这个任务,我写了一个像这样的SQL查询:

SELECT movie_collect.user_id, movie_collect.movie_id
FROM (
    SELECT user_id, movie_id FROM movie_collection WHERE user_id = 1
    UNION
    SELECT user_id, movie_id FROM movie_collection WHERE user_id != 1 AND movie_id NOT IN (SELECT movie_id FROM movie_collection WHERE user_id = 1)
) AS movie_collect

尽管这个查询提供了我所需要的东西,但只是出于好奇心我想问,如果其他人有另一个想法来解决这个问题。

谢谢。

1 个答案:

答案 0 :(得分:0)

外部查询是多余的:

SELECT user_id, movie_id
FROM movie_collection
WHERE user_id = 1

UNION

SELECT user_id, movie_id
FROM movie_collection
WHERE user_id != 1
  AND movie_id NOT IN (SELECT movie_id
                       FROM movie_collection
                       WHERE user_id = 1)

UNION删除了重复项,因此您无需在第二个子查询中检查uid

SELECT user_id, movie_id
FROM movie_collection
WHERE user_id = 1

UNION

SELECT user_id, movie_id
FROM movie_collection
WHERE movie_id NOT IN (SELECT movie_id
                       FROM movie_collection
                       WHERE user_id = 1)

两个子查询之间的唯一区别是WHERE子句,因此您可以将它们组合在一起:

SELECT user_id, movie_id
FROM movie_collection
WHERE user_id = 1
   OR movie_id NOT IN (SELECT movie_id
                       FROM movie_collection
                       WHERE user_id = 1);