虽然在一段时间内只显示一行?

时间:2016-02-03 08:51:10

标签: php pdo while-loop

我有两个SQL表,一个包含"手动插入的数据"另一个"自动插入数据"通过脚本。

为了测试脚本是否运行良好,手动表和自动表是相同的。

所以,我想"比较"两个数据库,然后在另一个脚本中,突出显示差异。

// $currentdate_today_midnight is a timestamp

$sql_getLive = "SELECT * FROM worksheets WHERE entry_date > $currentdate_today_midnight";
$req_getLive = $cnx->query($sql_getLive);
$req_getLive->setFetchMode(PDO::FETCH_OBJ);

// countAll counts all rows for a table and a condition 
$countLive = countAll("worksheets", "entry_date > $currentdate_today_midnight");

$sql_getCriter = "SELECT * FROM criter_live WHERE entry_date > $currentdate_today_midnight";
$req_getCriter = $cnx->query($sql_getCriter);
$req_getCriter->setFetchMode(PDO::FETCH_OBJ);

$countCriter = countAll("criter_live", "entry_date > $currentdate_today_midnight");

if($countLive == 0){
    /* If there is no live (manual datas) inserted */
    echo "EMPTY";
    die();
}

while ($check_criter = $req_getCriter->fetch()) {

    while ($check_live = $req_getLive->fetch()) {

        if ($check_live->train_id == $check_criter->train_id) {

            /* check_live = worksheets */
            /* check_criter = criter_live */

            echo $check_live->train_id . "|" . $check_criter->entry_date . "|" . $check_live->entry_date . "|". $check_criter->left_date . "|". $check_live->entry_date . "|". $check_criter->train_type . "|". $check_live->train_type . "|". $check_criter->entry_number . "|". $check_live->entry_number . "|". $check_criter->left_number . "|". $check_live->left_number. "#";

        }
    }
}

所以,我试图在一段时间内做出一段时间"但它不起作用,我只得到一个" echo" ...而不是17(由于countAll函数返回)。

我犯了错误吗?或者还有其他解决方案吗?

谢谢!

4 个答案:

答案 0 :(得分:3)

也许您可以尝试直接在sql中找到差异,如下所示:

select * from `worksheets` where `entry_date` > $currentdate_today_midnight
    and `train_id` not in (
        select `train_id` from `criter_live` where `entry_date` > $currentdate_today_midnight
    )

稍加修改的版本,测试entry_date

select * from `worksheets` where `entry_date` > $currentdate_today_midnight
    and `entry_date` not in (
      select `entry_date` from `criter_live` where `entry_date` > $currentdate_today_midnight
    )

答案 1 :(得分:1)

编辑:我假设您在两个表中都有相同的数据。

删除第二个while循环:

while ($check_criter = $req_getCriter->fetch()) {

    $check_live = $req_getLive->fetch();

    if ($check_live->train_id == $check_criter->train_id) {

        echo $check_live->train_id . "|" . $check_criter->entry_date . "|" . $check_live->entry_date . "|". $check_criter->left_date . "|". $check_live->entry_date . "|". $check_criter->train_type . "|". $check_live->train_type . "|". $check_criter->entry_number . "|". $check_live->entry_number . "|". $check_criter->left_number . "|". $check_live->left_number. "#";

    }
}

基本上,在外部循环的第一次迭代中,您已从$req_getCriter获取1行并将其与$req_getLive中的所有其他行进行比较。第二次迭代不起作用,因为$req_getLive中的所有行都被提取。

答案 2 :(得分:0)

在外部循环的第一次迭代之后,您将从数据库结果集中获取内部循环中的所有项目,因此它将永远不会再次运行。

您当然可以从数组中的两个查询中获取所有项目并使用foreach循环重置内部循环的数据库游标,但您可以在一个数据库查询中执行此操作同样。

答案 3 :(得分:0)

如果两个表中的train_id序列相同,那么akasummer的答案将正常工作。如果序列不相同,则可能会错过某些行。

并且如果两个表中的train_id序列没有差异,则不需要在akasummer的答案中进行调整。

if ($check_live->train_id == $check_criter->train_id) 

这方面的简单方法我的内部联接在mysql中根据train_id和入口日期从两个表中获取数据。如下所示(语法中可能存在一些愚蠢的错误,但逻辑是可以理解的)

SELECT 
   W.*, 
   CL.entry_date AS cl_entry_date, 
   CL.left_date AS cl_left_date, 
   CL.train_type AS cl_train_type, 
   CL.entry_number AS cl_entry_number, 
   CL.left_number AS cl_left_number  
FROM 
   worksheets AS W, 
   criter_live AS CL 
WHERE 
   W.train_id = CL.train_id 
AND 
  W.entry_date > $currentdate_today_midnight 
AND 
  CL.entry_date > $currentdate_today_midnight

在一个结果中,您将获得两个表的列,然后您可以使用简单的while while循环进行检查。