Как объединить запросы?
В базе данные существуют три таблицы:
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 = (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?
Дополнительно:
Ответы:
Тебе можно вообще все три таблицы объединить в одну. И сделать partitioning by range по полю created.
При такой архитектуре все запросы у вас пойдут в одну таблицу. А поле push_type станет просто ненужным.
Или можете сохранить его чтобы различать бывшие типы строк push/push_actual.
По partitioning - посмотрите примеры как тут пишут https://dev.mysql.com/doc/mysql-partitioning-excer...
- не вариант менять структуру бд
Два LEFT JOIN, условие связывания - по id и определённому значению типа.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для объединения запросов в PHP можно воспользоваться функцией mysqli_multi_query(). Эта функция позволяет выполнить несколько SQL запросов одновременно.
Пример использования:
// Подключение к базе данных $conn = new mysqli($servername, $username, $password, $dbname); // Проверка подключения if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } // SQL запросы для объединения $sql = "SELECT * FROM table1; "; $sql .= "SELECT * FROM table2; "; // Выполнение объединенных запросов if ($conn->multi_query($sql)) { do { // Получение результата каждого запроса if ($result = $conn->store_result()) { // Обработка результатов while ($row = $result->fetch_assoc()) { // Вывод данных echo $row['column_name'] . "<br>"; } $result->free(); } } while ($conn->next_result()); } else { echo "Error: " . $sql . "<br>" . $conn->error; } // Закрытие соединения $conn->close();
Обратите внимание, что для выполнения нескольких запросов в одном вызове используется оператор точка с запятой для разделения запросов. После выполнения функции multi_query() необходимо использовать цикл do-while для обработки результатов каждого запроса. Кроме того, не забудьте закрыть соединение с базой данных после завершения работы.