MySQL - как правильно составить запрос к БД
Есть 2 таблицы.
1 таблица:
2 таблица:
Например, мне нужно выбрать все черные книги. В таком случае, я использую запрос:
SELECT book.id FROM book
LEFT JOIN book_attr ba ON(book.id = ba.book_id) WHERE ba.value = 'Big'
GROUP BY book.id
Все работает корректно. Но никак не удается понять, какой составить запрос, если, например, нужно выбрать книги с value = 'Big' и книги с value = 'Red'. При чем если у книги есть value = 'Big', но нет 'Red', то эта книга не подходит. В данных таблицах книга, которая походит под вышеописанные условия имеет book_id = 3. Пока что у меня получился такой запрос:
SELECT book.id FROM book
LEFT JOIN book_attr ba ON(book.id = ba.book_id) WHERE ba.value = 'Big' OR ba.value = 'Red'
GROUP BY book.id
Но он не подходит, так как в результате я получаю книги с id 1 и 3 (поскольку книга с id=1 имеет value='Big', а не подходит потому, что не имеет value='Red'). Буду благодарен за помощь!
Ответы (2 шт):
Держи.
Пояснение: нам нужен books.id который находится в book_attrs.book_id рядом с value 'Big' и value 'Red'.
Что делаем? Нам нужно условие, чтобы id был равен id в таблице book_attrs рядом с value 'Big' а так же, чтобы он был равен id в таблице book_attrs рядом с value 'Red'.
Вот и напишем же его:
SELECT
book.id as 'Red_Big_ID'
FROM
book
WHERE
book.id = (
SELECT
book_attr.book_id as 'fid'
FROM
book_attr
WHERE
book_attr.value = 'Big'
AND
book_attr.book_id = book.id )
AND
book.id = (
SELECT
book_attr.book_id as 'sid'
FROM
book_attr
WHERE
book_attr.value = 'Red'
AND
book_attr.book_id = book.id )
Удачи в обучении! А также держи отличную статью-шпаргалку по SQL ?✌
Так как в таблице book_attr данные неоднородные, то придется искать каждый тип отдельно.
SELECT
b.*
FROM book b
WHERE EXISTS
(SELECT
null
FROM book_attr ba
WHERE ba.book_id = b.id
AND ba.value = 'Big')
AND EXISTS
(SELECT
null
FROM book_attr ba
WHERE ba.book_id = b.id
AND ba.value = 'Red')

