Как совместить несколько запросов в один?

  • 24 августа 2023 г. 10:26
Ответы на вопрос 2
```php
$push_log = 
    (new Query())
    ->select([
        'message' => 'push.message',
        'status' => 'log.status',
        'created_at' => 'log.created_at'
    ])
    ->from(['push' => Push::tableName()])
    ->leftJoin(['log' => 'push_log'], 'log.push_id = push.id')
    ->where(['push.order_id' => $id])
    ->andFilterWhere(['OR',
        ['AND', 'push.created < DATE_SUB(CURDATE(), INTERVAL 1 MONTH)', ['log.push_type' => 0]],
        ['AND', 'push.created >= DATE_SUB(CURDATE(), INTERVAL 1 MONTH)', ['log.push_type' => 1]]
    ])
    ->all();
```

В данном коде добавлено `andFilterWhere(['OR', ...])`, чтобы объединить два условия в один запрос. Если `push.created` меньше текущей даты минус месяц, то применяется условие `log.push_type = 0`, иначе `log.push_type = 1`. Таким образом, получается один запрос, который учитывает условия для столбца "created" в таблицах "push" и "push_actual".
Можно объединить все три таблицы в одну и использовать разделение по полю "created" с помощью Partitioning by Range. При такой архитектуре все запросы будут направляться в одну таблицу, что сделает поле "push_type" ненужным. Однако, вы также можете сохранить это поле, чтобы различать типы строк "push" и "push_actual". 

Вы можете просмотреть примеры и документацию о том, как настраивается Partitioning в MySQL по ссылке: https://dev.mysql.com/doc/mysql-partitioning-excer...
Похожие вопросы