我创建了一个基本的电影数据库,为此我正在使用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
尽管这个查询提供了我所需要的东西,但只是出于好奇心我想问,如果其他人有另一个想法来解决这个问题。
谢谢。
答案 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);