2012-04-02 10 views
1

私は、IN文を使って他のmysqlクエリに埋め込まれたmysqlクエリを使うことになると、初心者です。MYSQLと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 
       ) 
      ) 
     ) 
    ); 

私は基本的に借り手が出版社メシュエンから本を借りているかどうかを確認しようとしています。私はちょうど間違っていることを解決するように思えない、私は個々のステートメントを通過しているし、すべての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 

:等が提案

+2

内部結合を使用しても動作しますか? –

+0

必要なデータを取得する前に、すべてのテーブルに参加しますか? –

+1

結合が結果を返さない場合、ユーザーはその本を借りていません。サブクエリは不要です。 – mikerobi

答えて

4

、JOINのは非常にクリーン、そしておそらくネストされたINSとは対照的に、このクエリを実行するためのより効率的な方法です:私は信じている

SELECT Borrower.BorId 
FROM Loan 
WHERE Loan.BcId IN... 

はされている必要があります。

SELECT Loan.BorId 
FROM Loan 
WHERE Loan.BcId IN... 
+0

パーフェクト、私のエラーを見つけるだけでなく、私のクエリを効率化するのに役立ちました! 乾杯! –

0

はすべてを交換してくださいによって=

明らかに結合を使用すると、はるかにクリーンになります。

0

MySQLがwith節をサポートしているかどうかは分かりませんが、SQL ServerではCommon Table Expressionと呼ばれるものを使用できます。これは簡単に決定する必要があるANSI SQL仕様です。

擬:

With 
    someMadeUpTableAlias AS 
    (
     SELECT... 
    ) 
SELECT ... 
FROM 
    OutsideTable AS A 
    someMadeUpTableAlias AS B ON (A. = B.) 

私はサブクエリで、本質的ではないがために、読みやすさのCTEのを活用するために、大きな努力をしてきました。一時的なテーブルを作成するシーンの背後に副作用を見て、mysqlにパフォーマンスヒットがいくつかあるかもしれません。最も簡単な方法は、クエリキャッシュをクリアして両方の方法で実行することです。