Страница 1 из 1

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

Добавлено: 2015.05.27, 02:43
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

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

Добавлено: 2015.05.27, 12:32
PaSiS
Посмотрите в сторону scopes

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

Добавлено: 2015.05.27, 12:44
nepster
а что там можно увидеть ? =)

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

Добавлено: 2015.05.27, 13:15
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)

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

Добавлено: 2015.05.27, 13:45
nepster
zelenin, спасибо.

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

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

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

Добавлено: 2015.05.27, 13:50
zelenin
nepster писал(а):zelenin, спасибо.

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

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

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

Добавлено: 2015.05.27, 13:54
nepster
вас понял, спасибо.

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

Добавлено: 2015.05.27, 21:18
jumper423
Изображение

Если правильно вас понял, то вам нужно реализовать левый средний вариант