2012-04-02 2 views
1

Я новичок, когда дело доходит до использования запросов mysql, встроенных в другие запросы mysql, используя инструкцию IN.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 
       ) 
      ) 
     ) 
    ); 

Я в основном пытаюсь выяснить, если заемщик позаимствовал книгу от издательства Methuen. Я просто не могу понять, что не так, я прошел через каждое отдельное заявление, и все они, похоже, работают не с общим запросом со всеми инструкциями IN.

Может ли кто-нибудь определить, что не так?

+2

Будет ли это работать с использованием внутренних соединений? –

+0

Соедините все таблицы вместе, прежде чем получать нужные данные? –

+1

Если соединение не возвращает никаких результатов, пользователь не заимствовал книгу. Нет необходимости в подзапросах. – mikerobi

ответ

4

Как предположил, JOIN и являются гораздо чище, и, вероятно, более эффективный способ сделать этот запрос в отличие от вложенных КН:

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... 
+0

Perfect, Помогли мне упорядочить мой запрос, а также определить мою ошибку! Приветствия! –

0

Заменить все IN by =

Очевидно, что использование соединений будет намного чище.

0

Я не уверен, поддерживает ли MySQL предложение with, но в SQL Server вы можете использовать что-то, называемое Common Table Expression. Это спецификация SQL ANSII, которую нужно легко определить.

псевдопользователей:

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

Я делал большое усилие, чтобы воспользоваться КТР из-за читаемость по своей сути не существует с подзапросов. Возможно, вы захотите взглянуть на побочные эффекты, поскольку за кулисами он будет создавать временную таблицу, а mysql может иметь связанные с производительностью хиты. Самый простой способ рассказать - это очистить кеш запросов и запустить его в обоих направлениях.

Смежные вопросы