1

Тема: Дві і більше умов для 1 стовпця

Привіт, почав вивчати SQL і є така база в якій: таблиця books
b_id  b_name                                            b_year  b_quantity
1    Eugene Onegin                                    1985       2
2    The Fishermen and the Golden Fish    1990       3
3    Foundation and Empire                    2000       5
4    Programming Psychology                    1998       1
5    The C++ Programming Language    1996       3
6    Course of Theoretical Physics            1981       12
7    The Art of Computer Programming    1993        7

таблиця authors
a_id  a_name
1    Donald Knuth
2    Isaac Asimov
3    Dale Carnegie
4    Lev Landau
5    Evgeny Lifshitz
6    Bjarne Stroustrup
7    Alexander Pushkin

і таблиця m2m_books_authors
b_id  a_id
7    1
3    2
4    3
6    4
6    5
4    6
5    6
1    7
2    7
               
Потрібно виконати запит, щоб вивести книжки, які мають автора Dale Carnegie та Bjarne Stroustrup(тобто книжка яку написали ці 2 автори, в даному випадку Programming Psychology)

Поки придумав таку реалізацію, але впевнений, що є легша реалізація, працюю в mySQL:

SELECT b_id, b_name
FROM (SELECT b_id, b_name
FROM books
JOIN m2m_books_authors USING(b_id)
WHERE a_id in (6)) as das
JOIN m2m_books_authors USING(b_id)
WHERE  a_id in (3);

2

Re: Дві і більше умов для 1 стовпця

Використовувати USING варто якщо проект заточений саме на MySQL, інакше - прості джойни аби не відходити від класичного ANSI SQL там де це не обов'язково (кросплатформеність). Хоча USING дійсно може бути часом зручніше.

Вкладений запит не дозволяє використовувати індекси, на гігантських таблицях це може бути критично для перфомансу.

Оцінюючи ж на око - щось сумнівно що воно повертає результат відповідно до умови. Спершу фільтруєте у вкладеному запиті за автором Bjarne, а потім джойните це з таблицею фільтрованою за іншим автором Dale. Підозрюю, воно не поверне взагалі нічого.

Якщо хочете швидко отримати допомогу, варто додавати семпл - CREATE TABLE і інсерт із тестовими даними. Інакше чекайте поки в когось прийде натхнення зробити це замість вас.

3

Re: Дві і більше умов для 1 стовпця

Оператор IN потрібен як раз для того, щоб порівнювати поле зі списком значень.

4

Re: Дві і більше умов для 1 стовпця

SELECT b_name FROM books LEFT JOIN m2m_books_authors ON books.b_id = m2m_books_authors.b_id WHERE a_id IN (3, 6);

Можливо так? Хоча я не перевіряв :)