MYSQL和IN请求
对于使用IN语句在其他mysql查询中嵌入mysql查询,我是一个初学者 我目前有以下问题:MYSQL和IN请求,mysql,Mysql,对于使用IN语句在其他mysql查询中嵌入mysql查询,我是一个初学者 我目前有以下问题: SELECT DISTINCT BorName FROM Borrower WHERE BorId IN ( SELECT Borrower.BorId FROM Loan WHERE Loan.BcId IN ( SELECT BookCopy.BcId FROM BookCopy WHERE BookCopy.BtId In (
SELECT DISTINCT BorName
FROM Borrower
WHERE BorId IN (
SELECT Borrower.BorId
FROM Loan
WHERE Loan.BcId IN (
SELECT BookCopy.BcId
FROM BookCopy
WHERE BookCopy.BtId In (
SELECT BookTitle.BtId
FROM BookTitle
WHERE BookTitle.PubId In (
SELECT Publisher.PubId
FROM Publisher
WHERE `PubName` = CONVERT( _utf8 'Methuen' USING latin1 ) COLLATE latin1_swedish_ci
)
)
)
);
我基本上是想知道借书人是否从出版商Methuen那里借了一本书。我似乎无法找出哪里出了问题,我已经检查了每个单独的语句,它们似乎都不符合所有IN语句的总体要求
任何人都能发现问题所在吗?正如所建议的那样,连接是一种更干净的查询方式,并且可能是一种更有效的查询方式,而不是嵌套的插入方式:
SELECT DISTINCT b.BorName
FROM
Borrower b
JOIN Loan l ON l.BorId = b.BorId
JOIN BookCopy bc ON bc.BcId = l.BcId
JOIN BookTitle bt ON bt.BtId = bc.BtId
JOIN Publisher p ON p.PubId = bt.PubID
WHERE
p.PubName = CONVERT( _utf8 'Methuen' USING latin1 ) COLLATE latin1_swedish_ci
此外,我认为您的第一个子查询中存在一个问题:
SELECT Borrower.BorId
FROM Loan
WHERE Loan.BcId IN...
我认为应该是:
SELECT Loan.BorId
FROM Loan
WHERE Loan.BcId IN...
与建议的一样,连接是一种更干净、更高效的查询方式,而不是嵌套的INs:
SELECT DISTINCT b.BorName
FROM
Borrower b
JOIN Loan l ON l.BorId = b.BorId
JOIN BookCopy bc ON bc.BcId = l.BcId
JOIN BookTitle bt ON bt.BtId = bc.BtId
JOIN Publisher p ON p.PubId = bt.PubID
WHERE
p.PubName = CONVERT( _utf8 'Methuen' USING latin1 ) COLLATE latin1_swedish_ci
此外,我认为您的第一个子查询中存在一个问题:
SELECT Borrower.BorId
FROM Loan
WHERE Loan.BcId IN...
我认为应该是:
SELECT Loan.BorId
FROM Loan
WHERE Loan.BcId IN...
将所有输入替换为=
显然,使用联接会更干净。用=
显然,使用连接会更干净。我不确定MySQL是否支持with子句,但在SQL Server中,您可以使用一种称为公共表表达式的东西。这是一个ANSII SQL规范,应该很容易确定 普苏埃多:
With
someMadeUpTableAlias AS
(
SELECT...
)
SELECT ...
FROM
OutsideTable AS A
someMadeUpTableAlias AS B ON (A. = B.)
我一直在努力利用CTE,因为子查询本身不具备可读性。您可能想看看副作用,因为在幕后它将创建一个临时表,mysql可能会有一些相关的性能影响。最简单的判断方法是清除查询缓存并双向运行。我不确定MySQL是否支持with子句,但在SQL Server中,您可以使用称为公共表表达式的东西。这是一个ANSII SQL规范,应该很容易确定 普苏埃多:
With
someMadeUpTableAlias AS
(
SELECT...
)
SELECT ...
FROM
OutsideTable AS A
someMadeUpTableAlias AS B ON (A. = B.)
我一直在努力利用CTE,因为子查询本身不具备可读性。您可能想看看副作用,因为在幕后它将创建一个临时表,mysql可能会有一些相关的性能影响。最简单的判断方法是清除查询缓存并双向运行。使用内部联接是否可行?在获取所需数据之前,将所有表联接在一起?如果联接没有返回任何结果,则表示用户没有借用该书。不需要子查询。是。我认为可以使用内部联接来获得相同的结果。使用内部联接可以吗?在获取所需数据之前,将所有表联接在一起?如果联接没有返回任何结果,则用户没有借用该书。不需要子查询。是。我认为您可以使用内部联接来获得相同的结果。完美,帮助我简化查询并发现错误!干杯完美,帮助我简化查询并发现错误!干杯