【问题标题】:Merging two mysql queries from different databases in PHP在 PHP 中合并来自不同数据库的两个 mysql 查询
【发布时间】:2015-08-24 18:22:35
【问题描述】:

我需要将来自两个数据库的一对 MySQL 查询合并到一个单独的多维关联数组中。下面是我正在处理的数据示例。

问题似乎与生成的 $data0 数组值缺少唯一键(理想情况下是相应的“sku”值)有关,以用作合并数据的索引。

期望的输出是:

Array (
    [0] => Array (
        [SKU] => 101
        [Description] => Test Item 1
        [On Hand 1] => 3
        [On Hand 2] => 7
    )
    [1] => Array (
        [SKU] => 102
        [Description] => Test Item 2
        [On Hand 1] => 11
        [On Hand 2] => 15
    )
)

可能有更好的方法来处理 MySQL 查询和所需的数组。如果是这样,请告诉我。请提供任何反馈,因为我是一名排名初学者,并将尽我所能获得的帮助。谢谢!

<?
$query1 = "SELECT sku, description, on_hand as 'On Hand 1' FROM database1"

$queryresult1 = mysql_query($query1, $connection1);

$data1 = array();
while ($resultrow1 = mysql_fetch_assoc($queryresult1)) {
    array_push($data1, $resultrow1);
}

$query2 = "SELECT sku, on_hand as 'On Hand 2' FROM database2"

$queryresult2 = mysql_query($query2, $connection2);

$data2 = array();
while ($resultrow2 = mysql_fetch_assoc($queryresult2)) {
    array_push($data2, $resultrow2);
}

$data0 = array_merge($data1, $data2);

//example code for troubleshooting
$data1 = array('101' => array('SKU' => '101', 'Description' => 'Test Item 1', 'On Hand 1' => 3), '102' => array('SKU' => '102', 'Description' => 'Test Item 2', 'On Hand 1' => 11));
print_r($data1);
echo "<br /><br />";
$data2 = array('101' => array('SKU' => '101', 'On Hand 2' => 7), '102' => array('SKU' => '102', 'On Hand 2' => 15));
print_r($data2);
echo "<br /><br />";
$data0 = array_merge($data1, $data2);

print_r($data0);
?>

【问题讨论】:

  • 不同的数据库或不同的表?
  • 这看起来很像两个表而不是数据库
  • 您只需要执行两个单独的查询,将两个结果保存到一个数组中,然后将这些数组推送到另一个数组中。我认为您已经有了正确的想法,我真的想不出更好的方法来做到这一点。您无法合并查询,因为它们是单独的数据库。您似乎已经在使用的方法不起作用吗?
  • @ShaneLessard 方法根据需要提取数据库数据。问题似乎是将数据合并到数组中。在处理多维数组时,array_merge() 函数似乎将第二个数组中的数据附加到第一个数组中的数据上。谢谢!
  • 如果可以的话,你应该stop using mysql_* functions。它们不再被维护并且是officially deprecated。改为了解 prepared statements,并考虑使用 PDO,it's really not hard

标签: php mysql arrays multidimensional-array


【解决方案1】:

通过循环遍历$data1 中的每个键,您可以使用当前的$key$data2 检索值。这将为您提供所需的结果:

$data1 = array('101' => array('SKU' => '101', 'Description' => 'Test Item 1', 'On Hand 1' => 3), '102' => array('SKU' => '102', 'Description' => 'Test Item 2', 'On Hand 1' => 11));
$data2 = array('101' => array('SKU' => '101', 'On Hand 2' => 7), '102' => array('SKU' => '102', 'On Hand 2' => 15));

$data0 = array();
foreach($data1 as $key => $data){
    $data['On Hand 2'] = $data2[$key]['On Hand 2'];
    $data0[] = $data;
}
unset($data1, $data2);

print_r($data0);

【讨论】:

  • 感谢您帮助解决这个问题。该解决方案效果很好!再次感谢! ... 为胜利而战!
【解决方案2】:

您最好使用单个 UNION 查询来解决这个问题:

SELECT sku, description, on_hand as 'On Hand 1' FROM database1
UNION ALL
SELECT sku, null       , on_hand as 'On Hand 2' FROM database2

注意null 用于database2 查询中的描述字段。 UNION 成员查询的列数和类型必须相同。

那么这很简单:

while($row = mysql_fetch_assoc($result)) { 
    $data[] = $row;
}

不需要两个查询、两个 fetch 循环和稍后的合并。

【讨论】:

  • 谢谢@marc-b。我不确定 UNION sql 函数是否可以工作,因为我正在查询的两个数据库位于不同的服务器上。
  • 哦,在那种情况下,是的......你需要两个查询,除非它们都是 mysql 服务器并且你可以设置一个联合表。
【解决方案3】:
<?php
// connection 1
$connection1= mysql_connect("localhost","root","");
//selecting database 1
mysql_select_db("database1",$connection1);
// select query from the database1 and table 1
$query1 = "SELECT sku, description, on_hand as 'On Hand 1' FROM database1.table1";
$queryresult1 = mysql_query($query1, $connection1);

$data1 = array();
while ($resultrow1 = mysql_fetch_assoc($queryresult1)) {
    array_push($data1, $resultrow1);
}
//connection 1
$connection2= mysql_connect("localhost","root","");
//selecting database 2
mysql_select_db("database2",$connection2);
// select query from the database2 and table 2
$query2 = "SELECT sku, on_hand as 'On Hand 2' FROM database2.table2";

$queryresult2 = mysql_query($query2, $connection2);

$data2 = array();
while ($resultrow2 = mysql_fetch_assoc($queryresult2)) {
    array_push($data2, $resultrow2);
}

$data0 = array_merge($data1, $data2);

print_r($data0);
?>

【讨论】:

  • 这似乎将query2的结果附加到query1的结果上。目标是将按 sku 索引的结果合并到一个带有键 SKU、On Description、On Hand 1 和 On Hand 2 的单个数组中。谢谢!
【解决方案4】:

您可以通过使用JOIN 语法在查询中连接两个表来做到这一点:https://dev.mysql.com/doc/refman/5.0/en/join.html

那么您的查询将如下所示:

SELECT
    table1.sku,
    table1.description,
    table1.on_hand as 'On Hand 1',
    table2.on_hand as 'On Hand 2'
FROM
    database1.table1 JOIN
    database2.table2 ON table1.sku = table2.sku

两个表中的行将相互连接,其中 sku 字段值相互对应。如果您想要 table1 和 table2 中的所有结果,可以创建LEFT JOIN

【讨论】:

  • JOIN sql 函数不是一个选项,因为表位于不同的主机上。如果我错了,请纠正我。
  • 没错,所以我看的更远了。您可以在第一台服务器上从第二台服务器FEDERATE table2:dev.mysql.com/doc/refman/5.0/en/federated-use.html 然后您可以将两者加入。
  • 不幸的是,我只有对这些数据库的只读访问权限,因为软件提供商不会提供写访问权限以最大程度地减少他们的支持风险。我想我仅限于解析 PHP 中的两个数组。谢谢!
猜你喜欢
  • 2012-02-18
  • 1970-01-01
  • 2013-11-22
  • 2012-08-21
  • 2013-07-30
  • 1970-01-01
  • 1970-01-01
  • 2020-01-10
  • 1970-01-01
相关资源
最近更新 更多