Страница 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
Если правильно вас понял, то вам нужно реализовать левый средний вариант