MySQL, выбрать книги нескольких авторов

Темы, не касающиеся фреймворка, но относящиеся к программированию в целом.
Ответить
Аватара пользователя
Maxim Glushko
Сообщения: 72
Зарегистрирован: 2017.04.24, 19:16
Откуда: Україна, Одеса

MySQL, выбрать книги нескольких авторов

Сообщение Maxim Glushko » 2018.09.07, 23:55

Прошу прощения за такой, возможно, тупой вопрос, но я что-то застопорился.

Есть 3 таблицы: авторы, книги и перемычка. Многие ко многим.

Нужно выбрать те книги, которые связаны с перечнем авторов.
Не по принципу: Горький + Толстой = Воробьишко и Война с миром.
А по принципу: Желязны + Шекли = История Рыжего демона.
Т.е. нужно выбрать книги, в которых отметились сразу все авторы из перечня, а не лишь один.

andku83
Сообщения: 727
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: MySQL, выбрать книги нескольких авторов

Сообщение andku83 » 2018.09.08, 01:45

Код: Выделить всё

$query = Book::find();
$list = [
    'Желязны',
    'Шекли',
];
foreach($list as $key => value) {
    $query->joinWith('author author'.$key, false)
        ->andWhere(['author'.$key.'.name' => $value]);
}
$result = $query->all();
хотя скорее всего неполучится из-за дублирования имен промежуточной таблицы.
Вот еще вариант:

Код: Выделить всё

$query = Book::find();
$list = [
    'Желязны',
    'Шекли',
];
foreach($list as $key => value) {
    $query->andWhere([
    	'IN', 'book.id', Author::find()
    	    ->select(['id' => 'author_book.book_id'])
    	    ->leftJoin('author_book', 'author_book.author_id = author.id')
    	    ->andWhere(['name' => $value])
    ]);
}
$result = $query->all();

Ответить