我这里有问题。我用不同的表创建了一个数据库。我有一个名为“电影”的表,有108部电影。该表包括列 “id,姓名,导演,年份,国家”, 名为“reviews”的表,其中包括列 “movie_id”(movie_id链接到被评论的电影的ID), “review_score”(1到5分), “审查(附审阅文本)”, “critics_id”(链接评论家的批评者 - 表), 还有一个名为“评论家”的表格,其中包括列 “critics_name”和“critics_id”。 问题是有超过100部电影,但只有10部被审查,我只需要列出已审查的电影,但评论和电影在不同的表格中。当我尝试简单的命令SELECT名称,审查FROM电影,评论 - 我得到一个重复电影的巨大列表(见图)my table 是否有任何命令可以仅列出已审阅的电影,以便每个评论的电影只在列表中一次? 先谢谢!
答案 0 :(得分:-1)
这是您使用联接的地方。您可以从影片表中选择并加入评论表,然后按照已加入评论的电影进行过滤。
例如:
SELECT movie.*, review.review_score, review.review
FROM movie
LEFT JOIN reviews AS review
ON review.movie_id = movie.movie_id -- assuming this column name is correct...
WHERE review.movie_id IS NOT NULL
您还可以在评论家表中添加其他联接:
SELECT movie.*, review.review_score, review.review, critic.critics_name
FROM ....
LEFT JOIN critics AS critic
ON critic.critics_id = review.critics_id
WHERE critic.critics_id IS NOT NULL
请注意,此示例使用left join突出显示联接的工作方式,因为如果找不到匹配项,则联接的结果将为null。
如果您使用了inner join,则不会得到任何与on
条款不匹配的结果,因此您不需要WHERE id IS NOT NULL
条款部分{1}}部分。
以上内部联接的例子将返回被评论的电影,以及评论家的名字:
SELECT movie.*, review.review_score, review.review, critic.critics_name
FROM movie
INNER JOIN reviews AS review
ON review.movie_id = movie.id
INNER JOIN critics AS critic
ON critic.critics_id = review.critics_id
另外 - 我使用AS
将复数表名称别名为单数名称,纯粹出于语义原因。如果您不想使用reviews
别名,可以继续使用critics
和AS
。
答案 1 :(得分:-2)
希望以下查询可以帮助您:
SELECT
m.name,
c.critics_name,
r.review_score,
r.review_text
FROM movies m
JOIN reviews r ON r.movie_id = m.id
JOIN critics c ON c.critics_id = r.critics_id
不同电影的更改查询如下:
SELECT DISTINCT m.name
FROM movies m
JOIN reviews r ON r.movie_id = m.id
JOIN critics c ON c.critics_id = r.critics_id