Нахождение строк, которым не соответствуют никакие строки другой таблицы

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
nepster
Сообщения: 838
Зарегистрирован: 2013.01.02, 03:35

Нахождение строк, которым не соответствуют никакие строки другой таблицы

Сообщение nepster »

Есть 2 таблицы. Объявления и сервисы

Когда кто-то пользуется сервисом, например выделяет объявление, то простой выборкой через реляцию можно получить все выделенные объявления, на примере кастомного квери:

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

$this->joinWith([
           'service' => function($query) {
               $query->andWhere('date_start < :date AND date_expiration > :date', [':date' => date('Y-m-d H:i:s')]);
           }
        ]); 
Реляция:

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

    public function getService()
    {
        return $this->hasOne(Service::className(), ['advert_id' => 'advert_id'])->andWhere(['service' => Service::SERVICE_ADVERT_IN_TOP]);
    }
 
а вот как получить все не выделенные объявления ?

Тоесть записей в таблице сервисы может и не быть, в могут быть но просрочены по date_expiration или еще не активны по date_start



zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Нахождение строк, которым не соответствуют никакие строки другой таблицы

Сообщение zelenin »

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

select * from advert where advert_id not in (select advert_id from service where date_start < :date AND date_expiration > :date and service = :service) 
исхожу из того, что advert_id - это pk в advert (хотя стандартная практика - id)

nepster
Сообщения: 838
Зарегистрирован: 2013.01.02, 03:35

Re: Нахождение строк, которым не соответствуют никакие строки другой таблицы

Сообщение nepster »

zelenin, спасибо.

Я вот думал про вложенный запрос, но дело в том, что там еще штук 10 джоинов и еще вложенный запрос и на выходе выходит ну очень очень жирный запрос.

Вопрос лично вам, как мы относитесь к cron в такой ситуации, чтобы избежать вложенных запросов и еще нескольких джоинов?
Тоесть просто добавить после selected в таблицу объявлений и по крону в зависимости от таблицы сервисов ее обновлять. Тогда будет более облегченный запрос where selected = 1 или where selected = 0.

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Нахождение строк, которым не соответствуют никакие строки другой таблицы

Сообщение zelenin »

nepster писал(а):zelenin, спасибо.

Я вот думал про вложенный запрос, но дело в том, что там еще штук 10 джоинов и еще вложенный запрос и на выходе выходит ну очень очень жирный запрос.
ну попрофилируйте, сколько по времени займет. может кэш поможет.
на время скорее джойны повлияют, а не доп условие
nepster писал(а):Вопрос лично вам, как мы относитесь к cron в такой ситуации, чтобы избежать вложенных запросов и еще нескольких джоинов?
Тоесть просто добавить после selected в таблицу объявлений и по крону в зависимости от таблицы сервисов ее обновлять. Тогда будет более облегченный запрос where selected = 1 или where selected = 0.
может и так, но это денормализация - я бы стал так делать в самом крайнем случае.

еще вариант: вьюшка на стороне бд.


Аватара пользователя
jumper423
Сообщения: 61
Зарегистрирован: 2015.05.23, 02:30
Откуда: Тирасполь
Контактная информация:

Re: Нахождение строк, которым не соответствуют никакие строки другой таблицы

Сообщение jumper423 »

Изображение

Если правильно вас понял, то вам нужно реализовать левый средний вариант
Хотите купить дешёвый, быстрый и качественный VPS сервер, моим выбором стал Rootwelt. Всем советую, не прогадаете ;)

Ответить