В базе есть две таблицы, например, таблица заказов и договоров.
В заказах 40к записей и в договорах такое же количество.
Первая таблица связана со второй один ко многим.
Нужно составить запрос так, чтобы при получении хотя бы одного значения по связи прекращалась выборка и переходило к следующей записи.
Например, берем первую запись и у неё связь нашлась через 10 записей во второй таблице (хотя есть связь на 2000 строке и на 35000), нужно прекратить поиск и чтобы дальше взялась вторая запись и пошел поиск по второй таблице.
Было бы отлично, если реализация через joinWith и прописью какого-то значения в select().
Если говорить простыми словами, то нужно найти есть ли хоть один договор в заказах.
Суть в том, чтоб запрос работал быстро, т.к. в самом запросе ещё много различных связей с другими таблицами.
Составление запроса
-
- Сообщения: 910
- Зарегистрирован: 2019.08.13, 01:49
Re: Составление запроса
Код: Выделить всё
SELECT * FROM order JOIN contract ON contract.id = (SELECT id FROM contract WHERE contract.order_id = order.id LIMIT 1)
Re: Составление запроса
Долго выполняется
Связи пробовал разные
Код: Выделить всё
Task::find()
->select(Task::TABLE_ALIAS . '.*, taskcontracts_id')
->from([Task::TABLE_ALIAS => Task::tableName()])
->joinWith(['taskContractOne' => function ($query) {
$query->select(['taskcontracts_id'])->limit(1);
},
], false, 'LEFT JOIN')
;
Код: Выделить всё
public function getTaskContract(){
return $this->hasMany(TaskContract::className(), ['task_id' => 'task_id'])->from([TaskContract::TABLE_ALIAS => TaskContract::tableName()]);
}
public function getTaskContractOne(){
return $this->hasOne(TaskContract::className(), ['task_id' => 'task_id'])->from([TaskContract::TABLE_ALIAS => TaskContract::tableName()]);
}
-
- Сообщения: 910
- Зарегистрирован: 2019.08.13, 01:49
Re: Составление запроса
Индексы есть? Покажите план запроса.
Вы все 40к записей за раз выбираете?
И запрос неправильно записан в билдере.
Вы все 40к записей за раз выбираете?
И запрос неправильно записан в билдере.
Re: Составление запроса
Благодарю Запрос исправил на упрощенную версию и индексы прописал.yiiliveext писал(а): ↑2019.11.28, 11:20 Индексы есть? Покажите план запроса.
Вы все 40к записей за раз выбираете?
И запрос неправильно записан в билдере.
В проекте используются индексы, но в данной таблице не сделано было.
А вообще выборка идет всех сразу записей и потом подготавливаются данные под аналитику и запихиваются в JqxGridWidget
Пихать индексирование во все таблицы не ухудшид ли работу с выборками?
-
- Сообщения: 910
- Зарегистрирован: 2019.08.13, 01:49
Re: Составление запроса
Не ухудшит. Для аналитики и статистики используйте кеширование уже обработанных данных, если они не меняются. К ним добавляйте свежие и формируйте отчет.
Re: Составление запроса
На сервере происходит кеширование запросов, а в самой аналитике происходит выгрузка и работа ведется уже только с теми данными, которые выгружены. Спасибо за помощьyiiliveext писал(а): ↑2019.11.28, 11:48 Не ухудшит. Для аналитики и статистики используйте кеширование уже обработанных данных, если они не меняются. К ним добавляйте свежие и формируйте отчет.