如何仅列出已审核的电影?

时间:2016-12-11 19:25:36

标签: mysql

我这里有问题。我用不同的表创建了一个数据库。我有一个名为“电影”的表,有108部电影。该表包括列 “id,姓名,导演,年份,国家”, 名为“reviews”的表,其中包括列 “movie_id”(movie_id链接到被评论的电影的ID), “review_score”(1到5分), “审查(附审阅文本)”, “critics_id”(链接评论家的批评者 - 表), 还有一个名为“评论家”的表格,其中包括列 “critics_name”和“critics_id”。 问题是有超过100部电影,但只有10部被审查,我只需要列出已审查的电影,但评论和电影在不同的表格中。当我尝试简单的命令SELECT名称,审查FROM电影,评论 - 我得到一个重复电影的巨大列表(见图)my table 是否有任何命令可以仅列出已审阅的电影,以便每个评论的电影只在列表中一次? 先谢谢!

2 个答案:

答案 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别名,可以继续使用criticsAS

答案 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