Как перевести этот SQL запрос?

Нужно построить такой запрос к search модели:
SELECT id, name FROM `products`
WHERE (`category_id`='КН3')
AND EXISTS(SELECT * FROM product_book WHERE product_book.product_id = products.id 
           AND product_book.book_name = 'book_language' 
           AND (SELECT name FROM book_language WHERE id = product_book.book_id) IN('Русский'))
  AND EXISTS(SELECT * FROM product_book WHERE product_book.product_id = products.id 
           AND product_book.book_name = 'book_binding' 
           AND (SELECT name FROM book_binding WHERE id = product_book.book_id) IN('Твердый'))

Как правильнее организовать вложенные and select?
  • Вопрос задан
  • 418 просмотров
Решения вопроса 1
@waspmax1 Автор вопроса
Проблему решил, кому интересно - вот код:
if(!empty($this->author)){
            $sql = new Expression("(SELECT name FROM book_authors WHERE id = product_book.book_id)");
            $row = (new Query())
                ->from('product_book')
                ->where('product_book.product_id=products.id')
                ->andWhere(['product_book.book_name' => 'book_authors'])
                ->andFilterWhere(['in', $sql, $this->author]);

            $query->andFilterWhere(['exists', $row]);
        }
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@BorisKorobkov
Web developer
Как создать запросы с подзапросами - RTFM https://www.yiiframework.com/doc/guide/2.0/en/db-q... (поиск на странице по "sub-query").

P.S. Ваш SQL в принципе не работает. Подзапрос можно использовать только вместо значения, а не имени поля.
Этот говнокод будет жутко тормозить.
Язык, тип обложки, category_id надо делать числовыми индексированными полями. И искать по ID, а не тексту.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы