【问题标题】:MySQL Query to find titles of movies with actors that have their name starting with BMySQL 查询以查找名称以 B 开头的演员的电影标题
【发布时间】:2019-02-18 21:39:11
【问题描述】:

我正在尝试编写一个 MySQL 查询,该查询将查找由名字以 B 开头的演员领导的电影的标题。我有 2 个表,一个演员表和一个电影表。在我的 Actor 表中,我有 actID 和 actName,在我的 Movie 表中,我有 mvID、actID (FK)、mvTitle、mvGenre、mvPrice、mvYear。我已经为一个类似的问题编写了一个查询,并且我试图为这个查询修改它,但它并不完全有效。到目前为止我所拥有的是:

SELECT mvTitle
FROM Movie
WHERE EXISTS (SELECT mvGenre
              FROM Movie,
                   Actor
              WHERE (Actor.actID = Movie.actID)
                and (Actor.actName LIKE 'B%'))

它返回所有电影标题而不是返回特定的标题(因为它应该只返回 3 个标题)但返回所有 10 个标题。

【问题讨论】:

  • 您需要一个相关的子查询。 (即条件包括主查询电影表。)
  • 因为你使用EXISTS,所以使用inner join
  • 今日提示:切换到现代、明确的JOIN 语法。更容易编写(没有错误),更容易阅读(和维护),并且在需要时更容易转换为外连接。
  • 轻松帮到你:stackoverflow.com/help/mcve
  • EXISTS 询问子查询是否返回一行。您的子查询返回所有“B%”演员及其电影。总是。您可以通过单独运行子查询来检查这一点。它的结果与您想要信息的主要查询的电影无关。这称为非相关子查询。您需要一个相关的子查询,而不是查找所有电影的所有“B%”演员,而是查找主查询中该行的一部电影的“B%”演员。请参阅 fa06 的答案以了解差异...

标签: mysql sql


【解决方案1】:

使用相关子查询

SELECT mvTitle
FROM Movie a
WHERE EXISTS (SELECT 1
              FROM Actor b
              WHERE a.actID = b.actID
                and b.actName LIKE 'B%')

【讨论】:

  • 你为什么不建议 OP 使用连接并避免子查询,因为它们又慢又丑?
  • @ygorbunkov:可能是因为EXISTS 更具可读性并且通常更快,因为它可以在每部电影找到的第一个匹配项时停止查找。
  • @Thorsten Kettner:好吧,让我们让它'大多数时候,'
【解决方案2】:
SELECT DISTINCT m.mvTitle from Movie m JOIN Actor a on a.actId = m.actId WHERE a.actName LIKE 'B%'

尝试一下...我选择使用联接而不是子选择——这对我来说似乎更简洁。

【讨论】:

  • 我会做SELECT DISTINCT,以避免重复,以防一部电影有多个 B 演员。
  • 加入两个表虽然您只想显示其中一个表中的数据,但对您来说似乎更干净?这很奇怪。您已经被告知,您缺少 DISTINCT,它来自于生成包含多个电影的中间结果。 SQL 的一个目标是像口语一样被阅读。例如:“为存在具有字母 B 的演员选择电影”。不是“选择带有字母 B 的演员与其演员组合的电影,而是只指电影,每部电影只需要一次”。
【解决方案3】:
SELECT mvTitle
FROM Movie where actID in (select actID from Actor where actName LIKE 'B%')

【讨论】:

  • 子查询又慢又丑,你应该尽可能避免使用它们,在这种特殊情况下,当然可以。
  • @ygorbunkov:你错了。你不应该在这里发表这样的声明。反之亦然:当您只想在另一个表中查找数据时,请使用[NOT] IN[NOT] EXISTS。仅当您对合并结果感兴趣时才加入。加入这里意味着生成一个大型中间数据集,然后您必须使用DISTINCT 减少该数据集。这可能代价高昂。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-22
  • 1970-01-01
  • 2021-09-08
  • 2015-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多