Возможно ли объединить два результата запроса с помощью PHP-кода?

#php #mysql #sql #sql-server

#php #mysql — сервер #sql #sql-сервер #mysql

Вопрос:

Мне нужно JOIN 2 таблицы (скажем, User amp; Order table) для модуля отчетности в моем веб-приложении.

Проблемы заключаются в следующем:

  1. User Таблица расположена на другом сервере и в другой СУБД, отличающейся от Order таблицы. Технически это другая система, поэтому User таблица расположена в базе данных SQL Server, в то время как Order таблица расположена в базе данных MySQL.

  2. Я не смог использовать Связанный сервер SQL Server, потому что политика моей компании этого не разрешает. Итак, я не мог JOIN использовать их напрямую с помощью SQL-кода. Они хотят, чтобы я использовал веб-сервис вместо связанного сервера.

  3. Результат JOIN работы с этими таблицами имеет большое количество строк (возможно, более 10 000 строк, поскольку данные предназначены для отчетности). Итак, я думаю, что это была ужасная вещь — сопоставлять их с помощью веб-сервиса.

Итак, я придумал это:

Я собрал 2 результата запроса из разных моделей и объединил их с моим кодом приложения (я использую PHP с CodeIgniter) :

 // First result
$userData = $this->userModel->getAllUser();

// Second result
$orderData = $this->orderModel->getAllOrder();
  

$userData Содержит все пользовательские объекты со следующими столбцами:

 [UserId, Username, Address, PhoneNumber, etc..]
  

И $orderData содержит все объекты заказа со следующими столбцами:

 [OrderId, UserId, Date, etc..]
  

Но возможно ли объединить эти два результата запроса в PHP / CodeIgniter?

Как насчет производительности при большом объеме данных?

Должен ли я просто использовать веб-сервис, как предложено, или есть другое решение для достижения этой цели?

Заранее спасибо 🙂

Комментарии:

1. Можно прочитать из базы данных MsSQL и вставить во временную таблицу MySQL, а затем присоединить ее к интересующей вас таблице MySQL?

2. О да, кажется, это возможно… Я получил массив из запроса SQL Server, затем вставил его в таблицу MySQL. Должен ли я выполнять цикл для каждой строки и вставлять их по одному или как?

3. Зависит от количества. Вероятно, проще всего зацикливаться на создании пакетов для вставки (таким образом, вы вставляете несколько сотен строк за раз), так как это будет более эффективно.

Ответ №1:

Несколько вещей, о которых стоит подумать:

  1. Вам действительно нужно вернуть все записи пользователей и заказов за один раз
  2. Вы действительно хотите вернуть все строки для этих двух типов записей
  3. Было бы лучше использовать модуль отчетов для этих запросов отчетов?
  4. Будет ли простой синтаксис SQL более разумным шагом, чем пытаться внедрить это с помощью CodeIgniter «Active Record» (переименованный в Query Builder в 3.0)
  5. JOIN Действительно ли это так плохо? Это не UNION , вы хотите, чтобы данные были связаны.

Я бы порекомендовал вам ограничить возврат данных SELECT только теми полями, которые вам действительно требуются, создать новую модель отчета, чтобы не пытаться испортить ваши общие модели, и сделать это с помощью raw SQL.

Сложные вещи становятся еще более сложными, когда вы слишком стараетесь придерживаться таких правил, как «1 таблица = 1 модель» и «Пользователь::getAllFoos обработка контроллера > Отчет::getMonthlyOrderStats()».

Комментарии:

1. Спасибо за ваш ответ. 1. Да, потому что мне нужно экспортировать всю сводку отчета в Excel. 2. Нет, потому что мне просто нужны пользователи, у которых есть какие-либо заказы. 3. Да, лучше иметь отдельный модуль. 4. Да, конечно, обычный SQL был бы отличным. Но я не смог получить прямой SQL, потому что таблица была разделена между различными СУБД. 5. Нет, это не так. Но проблема не в самой производительности SQL JOIN. Проблема в том, как выполнить ОБЪЕДИНЕНИЕ без прямого SQL?

2. Ох. Затем сопоставьте массив идентификаторов пользователей и выполните итерацию через вещи. Если вы буквально не можете использовать SQL для решения этой проблемы, потому что разные серверы — это разные движки, то foreaches — ваш единственный реальный вариант здесь.