Подзапрос в mySQL, ссылающийся на книгу по isbn, а не по названию - PullRequest
0 голосов
/ 12 ноября 2018

Мне нужно, используя подход подзапроса, определить, сколько раз книга с названием «Комната» была частью заказа.

соответствующие таблицы схем

заказДетали (oNo, bookISBN, количество)

книга (isbn, название, authorID, жанр, pubYear, издатель, rrPrice, avgRating)

Появляется в двух порядках, а bookISBN и isbn являются первичным и внешним ключом

Я пытался

SELECT Count(*)
FROM orderDetails
WHERE  'Room' in (SELECT title
                         FROM book)

Который возвращает 25, хотя есть только два заказа с книгой Комната. Я понимаю, почему это неправильно, но я не могу понять, как бы я назвал книгу по ее ISBN (без простого ввода 323, поскольку это было бы ярлыком)

Ответы [ 4 ]

0 голосов
/ 12 ноября 2018

По моему мнению, присоединение было бы лучше:

SELECT Count(*)
FROM orderDetails LEFT JOIN book ON isbn=bookISBN
WHERE  title LIKE N'%Room%'

, но если вы должны использовать подзапрос:

SELECT Count(*)
FROM orderDetails
WHERE  bookISBN in (SELECT isbn
                    FROM book 
                    WHERE title LIKE N'%Room%')

, независимо от того, каким образом мы используем, мы всегда должны использовать общее поле дляполучить

0 голосов
/ 12 ноября 2018

Используйте этот запрос

SELECT Count(*)
FROM orderDetails
WHERE bookISBN in (SELECT isbn
                         FROM book where title = 'Room')

Вы также можете использовать оператор Like в подзапросе %Room% для заголовка

0 голосов
/ 12 ноября 2018

Обычный запрос, без использования подзапроса:

SELECT
    COUNT(1)
FROM 
    orderDetails od
    INNER JOIN book b ON b.isbn = od.bookISBN
WHERE
    b.title LIKE '%ROOM%'

Ненормальный запрос, с внутренним запросом, я не рекомендую это, так как это не нужно, но здесь мы идем:

SELECT
    COUNT(1)
FROM 
    orderDetails od
    INNER JOIN (
        SELECT isbn, title FROM book
    ) b ON b.isbn = od.bookISBN
WHERE
    b.title LIKE '%ROOM%

Еще более ненормальный запрос с подзапросом:

SELECT
    COUNT(1)
FROM
    orderDetails od
WHERE
    od.bookISBN IN (SELECT isbn FROM book WHERE title like '%ROOM%')

СОВЕТЫ: ​​

1. Я использовал count(1), поскольку подсчет всех столбцов не имеет смысла, поэтому вместо этого вы можете просто подсчитать успешные записи в условии, и это будет быстрее.

2. Использование подзапроса ограничивает возможности компилятора, поэтому я советую против него.

0 голосов
/ 12 ноября 2018

Ваше условие where оценивается как true или false. Он не связан с внешним запросом, поэтому:

  • «истина» означает, что все строки возвращены (и подсчитаны)
  • «false» означает, что строки не возвращаются (и не учитываются)

Это можно исправить с помощью предложения корреляции:

SELECT Count(*)
FROM orderDetails od
WHERE 'Room' IN (SELECT b.title FROM book b WHERE od.bookISBN = b.ISBN);
...