Задать вопрос
@twohundrediq

Как объединить запросы?

В базе данные существуют три таблицы:
1. push_actual
2. push
3. push_log
Таблицы push_actual и push имеют поле created, спустя месяц после создания записи в таблице push_actual, она попадает в таблицу push.
Таблица push_log имеет колонку push_type (0 - push, 1 -push_actual), которая указывает на нужную таблицу.

Также существует код, который получает данные из таблицы push_actual = Push::tableName()

$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])
            ->all();


проблема в том, что в таблице push_log пересекаются id и некорректно получаются данные.
Как доработать запрос, чтобы он учитывал столбец created в таблицах push и push_actual, и если прошло более месяца, то получал данные по условию push_log.push_type = 0, иначе push_log.push_type = 1?
  • Вопрос задан
  • 132 просмотра
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 2
mayton2019
@mayton2019
Bigdata Engineer
Тебе можно вообще все три таблицы объединить в одну. И сделать partitioning by range по полю created.
При такой архитектуре все запросы у вас пойдут в одну таблицу. А поле push_type станет просто ненужным.
Или можете сохранить его чтобы различать бывшие типы строк push/push_actual.

По partitioning - посмотрите примеры как тут пишут https://dev.mysql.com/doc/mysql-partitioning-excer...
Ответ написан
@Akina
Сетевой и системный админ, SQL-программист.
Два LEFT JOIN, условие связывания - по id и определённому значению типа.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы