Mysql 初学者:不能用Subselect MIN正确排列我的WHERE语句?

Mysql 初学者:不能用Subselect MIN正确排列我的WHERE语句?,mysql,sql,mysql-workbench,Mysql,Sql,Mysql Workbench,由于某些原因,我无法使此查询返回任何内容 SELECT film.title, film.length FROM moviedb.film, moviedb.`language` WHERE film.length=(SELECT MIN(length) FROM moviedb.film) AND film.language_id=`language`.language_i

由于某些原因,我无法使此查询返回任何内容

SELECT 
     film.title, 
     film.length 
FROM moviedb.film, moviedb.`language` 
WHERE film.length=(SELECT 
                         MIN(length) 
                   FROM moviedb.film) 
AND film.language_id=`language`.language_id 
AND `language`.`name`='French' 
AND film.rating='R';

所以,我想返回两列,一行……最短的法国电影,评级为“R”。我是不是遗漏了什么?我已经挠头一个小时了。

不要使用旧式/隐式连接语法。看看这是为什么。因此,我将您的查询转换为显式联接。请尝试以下查询:

SELECT 
     A.title, 
     A.length 
FROM film A 
INNER JOIN language B ON A.language_id=B.language_id 
WHERE A.length=(SELECT MIN(length) FROM film) 
AND B.name`='French' 
AND A.rating='R';
SELECT sf.title, sf.length 
FROM moviedb.`language` l
    INNER JOIN moviedb.film sf               # "sf" from "shortest film"
      ON sf.language_id = l.language_id
    LEFT JOIN moviedb.film es                # "es" from "even shorter"
      ON es.rating = sf.rating AND es.language_id = sf.language_id
      AND es.length < sf.length              # "es" is shorter than "sf"
WHERE l.`name` = 'French' AND film.rating = 'R'
  AND es.length IS NULL                      # there is no "even shorter" film

您还需要在子查询中指定语言和评级,以获得以下各项中最短的影片:

SELECT 
     film.title, 
     film.length 
FROM moviedb.film f1 JOIN moviedb.`language`
     ON  film.language_id = `language`.language_id 
WHERE film.length = (SELECT MIN(length) 
                     FROM moviedb.film f2
                     WHERE f1.language_id = f2.language_id
                       AND f1.rating = f2.rating) 
AND `language`.`name`='French' 
AND film.rating='R';

您的查询有一个很大的缺陷,其他答案也指出了这一点:内部查询从整个表中选择最小的电影长度。外部查询尝试查找具有某些属性、分级、语言和长度等于内部查询选择的最小长度的电影。它不会产生任何结果,只是因为最短的电影与您搜索的分级、语言属性不匹配

这会尝试修复您的查询,并且可能会起作用。我没有测试它,我不喜欢不需要的子查询

请尝试以下查询:

SELECT 
     A.title, 
     A.length 
FROM film A 
INNER JOIN language B ON A.language_id=B.language_id 
WHERE A.length=(SELECT MIN(length) FROM film) 
AND B.name`='French' 
AND A.rating='R';
SELECT sf.title, sf.length 
FROM moviedb.`language` l
    INNER JOIN moviedb.film sf               # "sf" from "shortest film"
      ON sf.language_id = l.language_id
    LEFT JOIN moviedb.film es                # "es" from "even shorter"
      ON es.rating = sf.rating AND es.language_id = sf.language_id
      AND es.length < sf.length              # "es" is shorter than "sf"
WHERE l.`name` = 'French' AND film.rating = 'R'
  AND es.length IS NULL                      # there is no "even shorter" film
工作原理 它加入表格语言,仅选择电影别名为sf的法语电影,再次选择电影别名为es的法语电影。第一个连接是在language_id上。加上WHERE条件l.name='French',这确保它只选择法语电影

每对语言,由内部连接创建的胶片由左连接与es中具有相同评级和语言且长度较短的es.length 语言和评级的WHERE条件只保留我们需要的两对语言:“法语”,评级:“R”。最后一个条件es.length为NULL,因为没有比从sf中选择的胶片更短的胶片,所以仅保留es字段中具有NULL的胶片对

SELECT子句只获取我们需要的列。你可以使用表l和sf。从es中选择的值始终为空

关于演出的评论 无论您使用什么查询,为了使其尽可能快,所涉及的表都需要对用于搜索和比较的列(即on和WHERE子句中显示的列)进行索引


对于此查询,列为film.language_id、film.rating和film.length。还有language.language\u id,但它可能是一个已编入索引的PK。

在子查询中,您需要指定所需的最小长度语言?目前,它正在获取可能用于其他语言电影的最小长度,这就是它不匹配任何记录的原因。你可以使用JOIN@Napoleon,你能在这里提供一个虚拟表吗?这会很有帮助。我正在尝试让这个查询返回最短的法国电影,评级为R。我需要在子查询中添加更多内容吗?恐怕这没用。当我删除minsubselect并将其作为自己的查询运行时,它就工作了。如果我删除MIN语句,整个查询也会工作,所以我认为我对MIN语句做了一些错误的事情?谢谢你的帮助