Объединение двух таблиц на двух разных серверах с помощью PHP (Foreach)

Объединение двух таблиц на двух разных серверах с помощью PHP (Foreach)

У меня две базы данных на двух разных серверах.

В этих двух базах данных у меня есть две таблицы с одинаковым названием «заказы». (см. изображение)

В таблице заказов в базе данных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 раз, я думаю, что это не очень хорошая идея.

Есть ли лучшее решение этой проблемы?

Как часто вам нужно запускать запрос?

Dammeul 09.08.2018 12:31

Я думаю, что базы данных используют сортировка-слияние, используя индекс. Вы, вероятно, сможете подражать этому, если добавите ORDER BY в свой выбор. Конечно, лучшее решение - перенести одну из ваших баз данных на тот же сервер, что и другой, но я предполагаю, что здесь это не вариант.

apokryfos 09.08.2018 12:33

@Dammeul Два запроса выполняются один раз

Abdes 09.08.2018 12:36

@apokryfos Да, я не могу, потому что первая база данных используется из другого приложения, по этой причине я не могу изменить структуру базы данных

Abdes 09.08.2018 12:39

Посмотрите на соединение сортировки-слияния, это должно быть 10000 + 100 операций вместо 10000 * 100, что, вероятно, более приемлемо.

apokryfos 09.08.2018 12:43

Вы можете использовать подзапрос. Как идентификаторы заказа первого запроса в предложении where второго запроса. Итерировать только по совпадающим записям.

Ankit Arora 09.08.2018 12:55
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
3
6
69
1

Ответы 1

Учитывая, что у вас есть оба массива заказов в формате:

$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 с учетом количества ваших заказов.

Обновлено: Преобразование возвращенных строк БД в предложенный формат также занимает линейное время, поэтому оно намного более эффективно, чем ваше первоначальное решение.

Другие вопросы по теме