从两个数据库中检索数据

时间:2015-06-24 08:22:55

标签: php mysql multiple-databases

我每个都有两个数据库和表。我正在读取DB1表1的renewal_date并获取当前月份的renewal_date和该记录的domain_name。

enter image description here

然后我尝试从DB2 table2中检索从DB1 table1中选择的domain_name的d_due_date。

然后我需要在一个表中显示domain_name,renewal_date,d_due_date。

我可以通过使用INNER JOIN加入数据库来实现这一目的。

我需要的是编写单独的选择查询和显示。

     $sql = "select domain_name from table1 where MONTH(renewal_date) = '06'";

    $result = mysqli_query($link_id,$sql);
    if(!$result) die(sql_error());
    $DoNM= Array();

   $sql1= "select d_due_date from domains where d_domain IN  ('abc.com','akaaasa.com')";
   $result1 = mysqli_query($link_id1,$sql1);
   if(!$result1) die(sql_error());
   $DoNM1= Array();

  echo '<table>';
  while(($row1 = mysqli_fetch_array($result1,MYSQL_ASSOC))&&($row = mysqli_fetch_array($result,MYSQL_ASSOC))){

   echo "<tr>";
   echo "<td>" .$DoNM[]=  $row['domain_name'] . "</td>";
   echo "<td>" .$DoNM[]=  $row['renewal_date'] . "</td>";
   echo "<td>" .$DoNM1[]=  $row1['d_due_date'] . "</td>";

   echo "</tr>";
   }
   echo '</table><br />';

我在$ sql1中硬编码了域名。我想要的是从$ sql获得它。我怎么能这样做。

3 个答案:

答案 0 :(得分:1)

所以你需要做的就是处理第一个查询结果并构建数组,然后将数组的内容转换为逗号分隔列表

$sql = "select domain_name, renewal_date
        from table1 
        where MONTH(renewal_date) = '06'";

$result = mysqli_query($link_id,$sql);
if(!$result) die(sql_error());

$db1= Array();
$InList = '';
while( $row = mysqli_fetch_array($result,MYSQL_ASSOC) ) {
    $InList .= sprintf("'%s',", $row['domain_name']);
    $db1[$row['domain_name']] = $row['renewal_date'];  
}
$InList = rtrim($InList, ',');

$sql = "select d_due_date, d_name 
        from domains 
        where d_domain IN ($InList)";

$result = mysqli_query($link_id1,$sql);
if(!$result) die(sql_error());

echo '<table>';

while( $row = mysqli_fetch_array($result,MYSQL_ASSOC ){

    echo '<tr>';
       echo '<td>' . $row['d_name'] . '</td>';
       // find the db1.renewal_date matching d_name from db1 array
       echo '<td>' . $db1[$row['d_name']] . "</td>";
       echo '<td>' . $row['d_due_date'] . '</td>';
    echo "</tr>";
}

echo '</table><br />';

RE:您的评论

所以现在我已经将db1中的数据保存到一个数组中,您可以在输出阶段使用从中获取db1.renewal_date。我还将db1.d_name添加到第二个查询中,因此您拥有包含db1.renewal_date的数组的键

RE:使用table1中的更多字段:

当然,这不是问题。这意味着您必须存储一个数组,即$ row作为数据,这样您就可以在$db1数组中保存完整的列集。

$sql = "select domain_name, renewal_date, f3, f4
            from table1 
            where MONTH(renewal_date) = '06'";

    $result = mysqli_query($link_id,$sql);
    if(!$result) die(sql_error());

    $db1= Array();
    $InList = '';
    while( $row = mysqli_fetch_array($result,MYSQL_ASSOC) ) {
        $InList .= sprintf("'%s',", $row['domain_name']);

        $db1[$row['domain_name']] = $row;  

    }
    $InList = rtrim($InList, ',');

$db1数组现在看起来像这样:

Array
(
    [abc.com] => Array
        (
            [domain_name] => abc.com
            [renewal_date] => 2015-06-06
            [f3] => aaa
            [f4] => bbb
        )

    [xyz.com] => Array
        (
            [domain_name] => xyz.com
            [renewal_date] => 2015-06-07
            [f3] => ccc
            [f4] => ddd
        )

)

因此,域名仍然是数组每次出现的KEY,但是您有另一个与该键相关联的数组,而不仅仅是一个字符串。

因此,要访问此数组,请执行此操作以使用特定于域的列。

echo '<td>' . $db1[ $row['d_name'] ] ['renewal_date'] . "</td>";
echo '<td>' . $db1[ $row['d_name'] ] ['f3'] . "</td>";
echo '<td>' . $db1[ $row['d_name'] ] ['f4'] . "</td>";

我希望这个解释得足以帮助你。

答案 1 :(得分:-1)

首先,你可以在一个包含多个表的数据库中执行此操作,这些表比使用以下内容更好,更容易使用:

  SELECT domain_name,renewal_date,d_due_date
  FROM table1 INNER JOIN table2
  ON table2.d_name = table1.domain_name
  WHERE MONTH(table1.renewal_date) = '06'";

这样的东西(也看作是referance) using where and inner join in mysql

答案 2 :(得分:-1)

我认为由于使用&amp;&amp; while循环中的运算符。可能有一个表的结果为空,这就是结果集可能为空的原因。