嵌套while循环跳过第一个结果

时间:2011-03-11 04:35:48

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

我需要查询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);
   }
} 
?>

输出时,我明白了:

1Bill

2Bob “比尔的叙述”

3Tom “鲍勃的叙述”

4 “汤姆的叙述”

有关它为什么在嵌套循环上跳过Bill的查询的任何想法?

3 个答案:

答案 0 :(得分:1)

出于某种原因,我不能对你的问题发表评论,所以我会发一个答案。看起来你有某种一对一的索引问题。

正如你所看到的那样,“比尔的叙事”正在与鲍勃一同印刷,“鲍勃的叙述”正在与汤姆一起印刷。你也没有与Bill的叙述,你只有一个索引4的叙述。但是,既然你没有真正使用索引来做任何查询,它可能是两件事之一:

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

2)您正在进行的查询未返回您期望的内容。

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

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

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

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

答案 1 :(得分:1)

从我的理解,你不能保证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'];
}

答案 2 :(得分:0)

好吧,我对此没有任何解释 - 我从零开始,它起作用了。谢谢大家的帮助!