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