【问题标题】:Nested while loop skips first result嵌套的while循环跳过第一个结果
【发布时间】:2011-03-11 04:35:47
【问题描述】:

我需要查询一个 MySQL 表以获取名称列表,然后根据该名称列表,查询与其相关的报告。这是我的代码:

//query the peoples

$query_people = mysql_query("SELECT * FROM people ORDER BY people_name ASC")
while($fetch_people = mysql_fetch_array($query_people)){
    $people_id = $fetch_people[people_id];
$people_name = $fetch_people[people_name];
$query_report = mysql_query("SELECT * FROM report WHERE report_entity = '$people_name'");

    // output each person's name
    echo($people_id.$people_name);

    //get their reports
    while($fetch_report = mysql_fetch_array($query_report)){
    $report_id = $fetch_report[report_id];
    $report_type = $fetch_report[report_type];
    $report_narr = $fetch_report[report_narr]; 
    echo($report_narr);
   }
} 
?>

当它输出时,我得到了这个:

1比尔

2鲍勃 “比尔的叙述”

3汤姆 “鲍勃的叙述”

4 “汤姆的故事”

关于它为什么跳过 Bill 在嵌套循环中的查询有什么想法吗?

【问题讨论】:

  • 可能是表数据本身有问题?
  • 我不这么认为 - 我有另一个页面以不同的方式提取数据,但使用相同的查询可以正常工作。
  • 那很奇怪,代码看起来不错。但也许我也错过了一些东西。
  • 你开启所有报错了吗?

标签: php mysql loops while-loop nested-loops


【解决方案1】:

由于某种原因,我无法对您的问题发表评论,因此我将发布答案。看起来你有某种非一索引问题。

如您所见,“Bill 的叙述”是用 Bob 打印的,“Bob 的叙述”是用 Tom 打印的。此外,您没有对 Bill 的叙述,而只有对索引 4 的叙述。但是,由于您并没有真正使用索引来执行任何查询,因此它可能是以下两种情况之一:

1) 表中的数据存储不正确。

2) 您正在执行的查询未返回您期望的结果。

对于这两种情况,请尝试在 mysql 中运行您在代码中发布的确切查询,并查看数据是否符合您的预期。另外,尝试添加更多的 echo 语句,例如 $people_id$people_name。并回显创建$query_report 的第二条sql 语句,确保这是您所期望的。

最后,通过打印将始终显示的内容或在现有的 echo 语句中添加引号来确保您正在进入嵌套的 while 循环:

echo "'" . $report_narr . "'";

这样你就知道你至少进入了循环并且查询返回了结果。否则,您的数据库可能不会按照您认为的方式排列。

【讨论】:

    【解决方案2】:

    据我了解,您不能保证 mysql 语句在事务之外执行的顺序。我会改用连接,它会比其中包含 mysql 查询的嵌套循环更快。

    $query = "
        SELECT * FROM `people`
        JOIN `report`
        ON `report`.`report_entity` = `people`.`people_name`
        ORDER BY `people`.`people_name` ASC
    ";
    
    $result = mysql_query($query);
    
    while($row = mysql_fetch_array($result)) {
        echo $row['report_narr'];
    }
    

    【讨论】:

    • 感谢大家的回复。我无法进行联接(除非我对联接有新的了解),因为我每人有数百份报告;我的想法是最简单的方法是从 people 表中获取人员,并在执行第一个 while 循环时,获取该人员的报告。有没有更好的方法来做到这一点?
    • 如果您有数以千计的报告,更重要的是不要使用循环执行此操作。如果您有一个包含索引列等的结构正确的表,则连接会被罚款,并且比与查询相关的 php 循环更有效。
    【解决方案3】:

    好吧,我对此没有任何解释 - 我从头开始,它奏效了。感谢大家的帮助!

    【讨论】:

      猜你喜欢
      • 2018-05-14
      • 1970-01-01
      • 1970-01-01
      • 2016-04-08
      • 1970-01-01
      • 1970-01-01
      • 2014-04-09
      • 2021-11-24
      • 2018-07-27
      相关资源
      最近更新 更多