Как смоделировать операцию SQL LEFT JOIN с использованием массивов PHP?

У меня есть приложение, которое подключается к нескольким серверам. где один сервер будет иметь идентификатор, который является внешним ключом для таблицы, расположенной на другом сервере. Проблема заключается в том, что MySQL не поддерживает связанные серверы, поэтому я не могу выполнить левый запрос, который ЛЕВ соединит 2 таблицы, расположенные на разных серверах.

Поэтому я должен получить 2 отдельных запроса с 2 разных серверов, используя PHP, и они оставили их, используя PHP.

Обратите внимание, что перечисленные ниже ключи массива должны быть динамическими. Я не могу использовать фиксированные имена, потому что разные запросы будут иметь разные имена столбцов. В приведенном ниже примере используется phone_call_id в качестве ключа, который используется для объединения обоих массивов, и он объединяет имя столбца. если $ right_array имеет больше столбцов, то эти столбцы необходимо добавить в окончательный массив.

так у меня 2 массива

$left_array =
Array
(
[0] => Array
(
[id] => 1
[start_on] => 2014-09-14 19:50:00
[end_on] => 2014-09-14 19:51:00
[subject] => This is a new event
[client_id] =>
[all_day_event] => 0
[event_type] => Event
[phone_call_id] => 122
)

[1] => Array
(
[id] => 2
[start_on] => 2014-09-15 05:53:00
[end_on] => 2014-09-15 06:53:00
[subject] => This is a new event
[client_id] =>
[all_day_event] => 0
[event_type] => Event
[phone_call_id] => 123
)

[2] => Array
(
[id] => 3
[start_on] => 2014-09-15 05:53:00
[end_on] => 2014-09-15 06:53:00
[subject] => This is a new event
[client_id] =>
[all_day_event] => 0
[event_type] => Event
[phone_call_id] =>
)
)

Правильный массив будет выглядеть так

$right_array =
Array
(
[0] => Array
(
[account_id] => 1
[phone_call_id] => 122
)

[1] => Array
(
[account_id] => 2
[phone_call_id] => 123
)
)

результаты должны быть похожи на этот массив

$joined_array =
Array
(
[0] => Array
(
[id] => 1
[start_on] => 2014-09-14 19:50:00
[end_on] => 2014-09-14 19:51:00
[subject] => This is a new event
[client_id] =>
[all_day_event] => 0
[event_type] => Event
[phone_call_id] => 122
[account_id] => 1
)

[1] => Array
(
[id] => 2
[start_on] => 2014-09-15 05:53:00
[end_on] => 2014-09-15 06:53:00
[subject] => This is a new event
[client_id] =>
[all_day_event] => 0
[event_type] => Event
[phone_call_id] => 123
[account_id] => 2
)

[2] => Array
(
[id] => 3
[start_on] => 2014-09-15 05:53:00
[end_on] => 2014-09-15 06:53:00
[subject] => This is a new event
[client_id] =>
[all_day_event] => 0
[event_type] => Event
[phone_call_id] =>
[account_id] =>

)
)

1

Решение

Эта функция имитирует операцию левого соединения

   //function to simulate the left join
function left_join_array($left, $right, $left_join_on, $right_join_on = NULL){
$final= array();

if(empty($right_join_on))
$right_join_on = $left_join_on;

foreach($left AS $k => $v){
$final[$k] = $v;
foreach($right AS $kk => $vv){
if($v[$left_join_on] == $vv[$right_join_on]){
foreach($vv AS $key => $val)
$final[$k][$key] = $val;
} else {
foreach($vv AS $key => $val)
$final[$k][$key] = NULL;
}
}
}
return $final;
}

// функцию можно использовать примерно так, если предположить, что имя столбца в левом массиве совпадает с именем правого массива

$final_array = left_join_array($left, $right, 'phone_call_id');

// функцию можно использовать примерно так, если предположить, что имя столбца в левом массиве «отличается, но имеет одинаковое соответствующее значение»

$final_array = left_join_array($left, $right, 'phone_call_id', 'p_c_id');
3

Другие решения

Привет, Вы можете попробовать этот кусок кода, это даст вам объединенный массив, похожий на левое внешнее соединение:

foreach($left_array as $k => $v){
foreach($right_array as $kk => $vv){
if($v['id'] == $vv['account_id']){
foreach($vv as $key => $val){
$left_array[$k]['right_'.$key] = $val;
}
}
}
}

вы получите поля из правильного массива с префиксом ‘right_’

1

Попробуйте это (при условии, что ваши пустые значения «phone_call_id» и «accout_id» равны нулю):

$joined_array = array();
foreach($right_array as $right_row){
$phone_call_id = $right_row['phone_call_id'];
$account_id    = $right_row['account_id'];
foreach($left_array as $i => $left_row){
if($left_row['phone_call_id'] === $phone_call_id){
$left_row['account_id'] = $account_id;
$joined_array[]         = $left_row;
}
}
}
//And here, we have to identify rows with empty 'phone_call_id'
foreach($left_array as $left_row){
if($left_row['phone_call_id'] === null){
$left_row['account_id'] = null;
$joined_array[]         = $left_row;
}
}
0

простое решение,

работал для меня использовать это,

function arrayLeftJoin($left,$right){
foreach ($left as $lkey => $lvalue) {
foreach ($right as $rkey => $rvalue) {
if($lkey==$rkey){
unset($left[$lkey]);
}
}
}
return $left;
}

Спасибо всем

0

Старайтесь избегать такого рода операций. Если вы можете, попробуйте разместить все базы данных на одном сервере и использовать SQL JOIN-ы. PHP не MYSQL. PHP не предназначен для (левой, правой и т. Д.) Таблиц соединения. например Если у вас есть огромное количество записей в левой таблице, возвращаемых mysql и помещенных как результат в массив, вы можете столкнуться с большими проблемами с памятью. Выполняйте задания MYSQL с помощью MYSQL, выполняйте задания PHP с помощью PHP. Таким образом вы сэкономите: время, спектакли и нейроны. 🙂

0
Похожие вопросы
Добавить ответ
Для оформления сообщений Вы можете использовать следующие тэги:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Нажимая кнопку «Отправить», я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности этого сайта.