MYSQL和IN请求

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 (

对于使用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 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可能会有一些相关的性能影响。最简单的判断方法是清除查询缓存并双向运行。

使用内部联接是否可行?在获取所需数据之前,将所有表联接在一起?如果联接没有返回任何结果,则表示用户没有借用该书。不需要子查询。是。我认为可以使用内部联接来获得相同的结果。使用内部联接可以吗?在获取所需数据之前,将所有表联接在一起?如果联接没有返回任何结果,则用户没有借用该书。不需要子查询。是。我认为您可以使用内部联接来获得相同的结果。完美,帮助我简化查询并发现错误!干杯完美,帮助我简化查询并发现错误!干杯