【发布时间】:2017-09-28 04:55:40
【问题描述】:
我有一个包含电影、演员和标签的 SQLite 数据库。
电影和演员、电影和标签之间是多对多的关系。
在我的应用程序中,我想列出所有电影及其对应的演员和标签,例如:
先生。与史密斯夫人:演员:布拉德皮特、安吉丽娜朱莉,标签:动作、喜剧、犯罪
乘客:演员:詹妮弗·劳伦斯、克里斯·帕拉特、标签:冒险、戏剧、浪漫
我想知道实现这一目标的正确 SQL 语句是什么。
我的数据库中的表定义如下:
CREATE TABLE "Movie"
(
id INTEGER PRIMARY KEY,
name VARCHAR
)
CREATE TABLE "Actor"
(
id INTEGER PRIMARY KEY,
name VARCHAR
)
CREATE TABLE "Tag"
(
id INTEGER PRIMARY KEY,
name VARCHAR
)
CREATE TABLE "Movie_Actor"
(
movie_id INTEGER,
actor_id INTEGER,
FOREIGN KEY(movie_id) REFERENCES "Movie" (id),
FOREIGN KEY(actor_id) REFERENCES "Actor" (id),
UNIQUE(movie_id, actor_id)
);
CREATE TABLE "Movie_Tag"
(
movie_id INTEGER,
tag_id INTEGER,
FOREIGN KEY(movie_id) REFERENCES "Movie" (id),
FOREIGN KEY(tag_id) REFERENCES "Tag" (id),
UNIQUE(movie_id, tag_id)
);
要获得带有演员和标签的单部电影,我使用以下 3 个查询(例如 Movie.id = 1):
获取电影行:
SELECT *
FROM Movie
WHERE id = 1
要获取演员:
SELECT *
FROM
(SELECT * FROM Actor) AS T1
JOIN
(SELECT * FROM Movie_Actor WHERE Movie_Actor.movie_id = 1) AS T2 ON T1.id = T2.actor_id
获取标签:
SELECT *
FROM
(SELECT * FROM Tag) AS T1
JOIN
(SELECT * FROM Movie_Tag WHERE Movie_Tag.movie_id = 1) AS T2 ON T1.id = T2.tag_id
我的问题是,当我获得诸如SELECT * FROM Movie 之类的电影列表时,我应该如何检索标签和演员?
许多 ORM 都有“急切加载”关系的选项,我想知道如何在纯 SQL 中做到这一点?
我是否需要对从SELECT * FROM Movie 获得的每一行执行额外的 2 个查询?
谢谢。
【问题讨论】: