Страница 1 из 2
join и where
Добавлено: 2014.11.19, 22:46
Shappy
Добрый вечер... Вечно у меня будут проблемы с join'ами видимо... Вопрос такой, есть 2 запроса:
Код: Выделить всё
BidBanner::find()
->joinWith('user')
->where('users.wallet >= bid_banners.bid')
->one();
Код: Выделить всё
BidBanner::find()
->joinWith('user')
->where(['>=', 'users.wallet', new Expression('bid_banners.bid')])
->one();
Во втором почему-то where не отрабатывает... В первом все нормально... Почему так?
Re: join и where
Добавлено: 2014.11.20, 10:40
zelenin
для начала приведи оба получившихся sql-запроса.
Re: join и where
Добавлено: 2014.11.20, 11:22
Shappy
Код: Выделить всё
BidBanner::find()
->joinWith('user')
->where('users.wallet >= bid_banners.bid')
->one();
SELECT `bid_banners`.* FROM `bid_banners` LEFT JOIN `users` ON `bid_banners`.`user_id` = `users`.`id` WHERE users.wallet >= bid_banners.bid
------
Код: Выделить всё
BidBanner::find()
->joinWith('user')
->where(['>=', 'users.wallet', new Expression('bid_banners.bid')])
->one();
SELECT `bid_banners`.* FROM `bid_banners` LEFT JOIN `users` ON `bid_banners`.`user_id` = `users`.`id` WHERE `users`.`wallet` >= bid_banners.bid
Первый рабочий, второй where не отрабатывает... Если эти sql выполнять напрямую, то оба будут нормально отрабатывать...
В общем-то проблем нет с этим, просто подумал не баг ли это...
Re: join и where
Добавлено: 2014.11.20, 11:30
zelenin
Shappy писал(а):Если эти sql выполнять напрямую, то оба будут нормально отрабатывать...
В общем-то проблем нет с этим, просто подумал не баг ли это...
откуда ты эти sql-запросы взял? сам напечатал? или из дебаг-панели?
почему считаешь, что одинаковые запросы будут выполняться по разному, если их выполнять в разных инструментах?
Re: join и where
Добавлено: 2014.11.20, 11:40
Shappy
Из дебаг бара взял оба sql... Эти 2 сырых запроса выдачу дают одинаковую, а вот AR разную...
Re: join и where
Добавлено: 2014.11.20, 11:43
zelenin
Shappy писал(а):Из дебаг бара взял оба sql... Эти 2 сырых запроса выдачу дают одинаковую, а вот AR разную...
а если в оба запроса поставить limit(1)? Проверьте выдачу в АР и напрямую.
Re: join и where
Добавлено: 2014.11.20, 11:50
Shappy
BidBanner::find()
->joinWith('user')
->where('users.wallet >= bid_banners.bid')
->limit(1)
->one();
SELECT `bid_banners`.* FROM `bid_banners` LEFT JOIN `users` ON `bid_banners`.`user_id` = `users`.`id` WHERE users.wallet >= bid_banners.bid LIMIT 1
Выдача верная.
----------
BidBanner::find()
->joinWith('user')
->where(['>=', 'users.wallet', new Expression('bid_banners.bid')])
->limit(1)
->one();
SELECT `bid_banners`.* FROM `bid_banners` LEFT JOIN `users` ON `bid_banners`.`user_id` = `users`.`id` WHERE `users`.`wallet` >= bid_banners.bid LIMIT 1
Выдача не верная.
Не поменялось ничего... Сырой sql отрабатывает оба варианта как надо...
Вчера читал про limit(1) ваши сообщения... Странно как-то сделали find()->one()...
Re: join и where
Добавлено: 2014.11.20, 11:52
zelenin
вы посмотрите получившиеся sql-запросы? Они ведь одинаковые? Тогда не может быть разной выдачи, т.к. в AR приходят те же данные.
Вы что-то путаете.
Re: join и where
Добавлено: 2014.11.20, 11:53
astronin
а если сделать без использования "new Expression" во втором запросе, то не работает ?
Re: join и where
Добавлено: 2014.11.20, 11:54
Shappy
Я понимаю что абсурдно как-то получается... Запросы на самом деле одинаковые на выходе, но по факту выдача у меня разная... Если не сложно, проверьте пожалуйста сами...
Re: join и where
Добавлено: 2014.11.20, 11:55
zelenin
Shappy писал(а):Я понимаю что абсурдно как-то получается... Запросы на самом деле одинаковые на выходе, но по факту выдача у меня разная... Если не сложно, проверьте пожалуйста сами...
проверяю
Re: join и where
Добавлено: 2014.11.20, 11:55
Shappy
если без new Expression, то он будет считать за переменную bid_banners.bid, т.е. вставит в sql: 'bid_banners.bid'
Re: join и where
Добавлено: 2014.11.20, 11:59
zelenin
Shappy писал(а):если без new Expression, то он будет считать за переменную bid_banners.bid, т.е. вставит в sql: 'bid_banners.bid'
ага.
Re: join и where
Добавлено: 2014.11.20, 12:02
Shappy
Как это нормально? я же сравниваю с другой колонкой, а не с переменной...
Re: join и where
Добавлено: 2014.11.20, 12:04
zelenin
Shappy писал(а):Как это нормально? я же сравниваю с другой колонкой, а не с переменной...
да, вы правы. Я просто не понял вашего сообщения.
Протестировал
Код: Выделить всё
$m = Post::find()
->joinWith('user')
->where('user_user.id >= blog_post.id')
->one();
Код: Выделить всё
SELECT `blog_post`.* FROM `blog_post` LEFT JOIN `user_user` ON `blog_post`.`user_id` = `user_user`.`id` WHERE user_user.id >= blog_post.id
Код: Выделить всё
$m = Post::find()
->joinWith('user')
->where('user_user.id >= blog_post.id')
->where(['>=', 'user_user.id', 'blog_post.id'])
->one();
Код: Выделить всё
SELECT `blog_post`.* FROM `blog_post` LEFT JOIN `user_user` ON `blog_post`.`user_id` = `user_user`.`id` WHERE `user_user`.`id` >= blog_post.id
запросы отличаются только экранированием в одном месте, что не критично. Выдача одинаковая - модель с id=1
АР генерирует одинаковые sql-запросы. Получает по этим sql-запросам одинаковую выдачу (sql-запросы выполняются pdo php). Не вижу места ошибке. Что-то вы путаете.
Re: join и where
Добавлено: 2014.11.20, 12:07
Shappy
Странно что у меня выдача разная... Может надо обновиться... Спасибо, попробую разобраться почему у меня по-другому...
Я понимаю что не должно быть разная, несколько раз уже проверял...
Re: join и where
Добавлено: 2014.11.20, 12:09
zelenin
Shappy писал(а):Странно что у меня выдача разная... Может надо обновиться... Спасибо, попробую разобраться почему у меня по-другому...
Я понимаю что не должно быть разная, несколько раз уже проверял...
имхо у вас другой запрос, но вы почему-то копируете этот.
Re: join и where
Добавлено: 2014.11.20, 12:11
Shappy
Не поленюсь... Еще раз внимательно посмотрю
Re: join и where
Добавлено: 2014.11.20, 12:13
Shappy
Сейчас только внимательно посмотрел... Попробуйте из вашего запроса второго вместо такого:
Код: Выделить всё
$m = Post::find()
->joinWith('user')
->where('user_user.id >= blog_post.id')
->where(['>=', 'user_user.id', 'blog_post.id'])
->one();
Оставить только один where, т.е. такой:
Код: Выделить всё
$m = Post::find()
->joinWith('user')
->where(['>=', 'user_user.id', 'blog_post.id'])
->one();
Выдача та же будет? Ну и там нужен new Expression все же, т.е. такой:
Код: Выделить всё
$m = Post::find()
->joinWith('user')
->where(['>=', 'user_user.id', new Expression('blog_post.id')])
->one();
Re: join и where
Добавлено: 2014.11.20, 12:29
Shappy
Я перепроверил, для достоверности чуть поправил запросы...
Код: Выделить всё
BidBanner::find()
->joinWith('user')
->where('`users`.`wallet` >= bid_banners.bid')
->where(['>=', '`users`.`wallet`', new Expression('bid_banners.bid')])
->one()
Код: Выделить всё
BidBanner::find()
->joinWith('user')
->where(['>=', '`users`.`wallet`', new Expression('bid_banners.bid')])
->where('`users`.`wallet` >= bid_banners.bid')
->one()
Эти два запроса теперь вообще генерирую одинаковый sql:
Код: Выделить всё
SELECT `bid_banners`.* FROM `bid_banners` LEFT JOIN `users` ON `bid_banners`.`user_id` = `users`.`id` WHERE `users`.`wallet` >= bid_banners.bid
я смотрю в дебаг-баре, сам sql не пишу;)
И точно выдача у меня разная... При первом запросе если вывести вардампом содержание у меня
["bid"]=>
string(5) "500.0"
...
["user"]=>
["wallet"]=>
string(5) "300.0"
При втором запросе у меня:
["bid"]=>
string(5) "555.0"
...
["user"]=>
["wallet"]=>
string(6) "1000.0"