У меня две базы данных на двух разных серверах.
В этих двух базах данных у меня есть две таблицы с одинаковым названием «заказы». (см. изображение)
В таблице заказов в базе данных2 есть информация, которая мне нужна, например, столбцы «импорт» и «доставка».
Для объединения двух таблиц я использовал два цикла foreach:
<?php
$all=array();
// get 100 Records from 30 000 Records (Database1) because i work with pagination
$ordersFromDB1 = "SELECT * FROM orders LIMIT 0,100";
// get all 10 0000 Records for checking (Database2)
$ordersFromDB2 = "SELECT * FROM orders";
foreach ($ordersFromDB1 as $order1) { //100 times
foreach ($ordersFromDB2 as $order2) { //10 000 times
if ($order1['ID_order']==$order2['ID_order']) {
//put column "import" from order2 in order1
$order1['import']=$order2['import'];
// put column "shipping" from order2 in order1
$order1['shipping']=$order2['shipping'];
}
}
$all[]=$order1;
}
//foreach loop will be execute 100 * 10 000 = 1 000 000 times
// $all stoke the two orders table (orders1,orders2) in one array
Этот код работает нормально, но если вы видите, что цикл foreach будет выполняться 100 * 10 000 = 1 000 000 раз, я думаю, что это не очень хорошая идея.
Есть ли лучшее решение этой проблемы?
Я думаю, что базы данных используют сортировка-слияние, используя индекс. Вы, вероятно, сможете подражать этому, если добавите ORDER BY
в свой выбор. Конечно, лучшее решение - перенести одну из ваших баз данных на тот же сервер, что и другой, но я предполагаю, что здесь это не вариант.
@Dammeul Два запроса выполняются один раз
@apokryfos Да, я не могу, потому что первая база данных используется из другого приложения, по этой причине я не могу изменить структуру базы данных
Посмотрите на соединение сортировки-слияния, это должно быть 10000 + 100 операций вместо 10000 * 100, что, вероятно, более приемлемо.
Вы можете использовать подзапрос. Как идентификаторы заказа первого запроса в предложении where второго запроса. Итерировать только по совпадающим записям.
Учитывая, что у вас есть оба массива заказов в формате:
$orders1 = array('order_id' => order)
$orders2 = array('order_id' => order)
Вы можете сделать что-то вроде этого:
foreach ($orders2 as $id => $order2) {
if (array_key_exists($id, $orders1)) {
$orders1[$id]['import'] = $order2['import'];
}
}
Это должно занять время linear
с учетом количества ваших заказов.
Обновлено: Преобразование возвращенных строк БД в предложенный формат также занимает линейное время, поэтому оно намного более эффективно, чем ваше первоначальное решение.
Как часто вам нужно запускать запрос?