【问题标题】:Multiple While Loops within a While Loop?While循环中有多个While循环?
【发布时间】:2011-08-09 11:55:52
【问题描述】:

所有尝试学习的新手...感谢迄今为止的所有帮助!

更新 - 下面更新了代码 - 感谢 Phill

我现在正试图从表 horses 中获取相关的马信息,我可以使用 horse_name 字段将其加入 race_form。然后,我想在 while($racecard) 信息下方显示比赛中每匹马的信息。这是否使它更清晰一点?

我想我可以只做另一个查询,然后用 mysql_fetch_array 在我已经拥有的那个下面进行一个 while 循环,这将显示它然后进入下一场比赛,但这显然行不通......?!

我想知道您是否可以在一个while 循环中一个接一个地运行2 个while 循环?我正在制作赛马表格指南 - 我可以显示每场比赛列表,但在下面我想显示比赛中每匹马的个别马匹详细信息。无论如何,如果您查看此页面,您可以看到我正在尝试做的事情:

http://tasmanianracing.com/superform/formguide.php?meetingID=21042011LAUN&Submit=View+Form

问题是,只要我在比赛列表后面放第二个 while 循环,它就不会出现。我正在尝试运行查询以从我的马表中获取马的详细信息,然后为比赛中的每匹马运行一段时间,但没有任何显示。

我希望这已经足够清楚了......我的 sn-p 代码如下 - 如果我错过了重要的事情,请告诉我:


echo "<table width='990' border='1' cellspacing='2' cellpadding='2'>";

$racedetails = mysql_query("SELECT * 
    FROM race_info
    WHERE meetingID = ('" . $safemeetingID . "')");

while($row = mysql_fetch_array($racedetails))
{
    echo "<tr><td>Race " . $row['race_number'] . " at " . $row['start_time'] . " " . $row['class'] . " over " . $row['distance'] . "m</td></tr>";

    $racecard = mysql_query("SELECT *
        FROM race_form
        INNER JOIN race_info ON race_form.raceID = race_info.raceID
        WHERE race_form.raceID = ('" . $row['raceID'] . "')");

    while($row = mysql_fetch_array($racecard))
    {
        echo "<tr><td>" . $row['number'] . "</td><td>" . $row['past10'] . "</td><td>" . $row['horse_name'] . "</td></tr>";
    }

    echo "</table><br>";

    echo "<br>I wish I could put in some horse form here...<br>";

    echo "<table width='990' border='1' cellspacing='2' cellpadding='2'>";

}

echo "</table>";

【问题讨论】:

  • 如果你愿意,你可以将循环堆叠 1000 深,只需要一个开始就需要很长时间来执行完整的外循环。
  • 嵌套循环并不少见。但请确保所有循环都有退出条件,就像@Calum 所说的那样,以确保以优化的方式执行以防止超时。
  • 我不确定您到底遇到了什么问题,但如果它与您在每个 while 循环中重用变量 $row 相关,我不会感到惊讶......为什么不尝试为每个循环使用不同的变量?
  • 好的,谢谢 - 我确信有更好的方法,但我的技能还很初级,所以我能想到的只有这些!
  • 专业提示: 将选择查询放在循环中是一个非常糟糕的主意。您应该尝试在循环之外选择所有信息,然后进行操作。

标签: php mysql while-loop


【解决方案1】:

您可能需要更改一些$row 变量的名称,它们可能会相互干扰。

例如:

while($row_races = mysql_fetch_array($totalraces)){
while($row_details = mysql_fetch_array($racedetails)){
while($row_card = mysql_fetch_array($racecard)){

【讨论】:

  • 谢谢...我太新了,我没有意识到我可以以不同的方式命名每个行变量-我认为必须是这样才能调用行...大声笑
  • 不,不成功。当我把我的第二个 while 循环放在我有测试测试的地方时,什么都没有显示
【解决方案2】:

我认为您可以摆脱您的一个查询:

第一个查询通过选择一个 COUNT 来获取比赛的数量,这将返回一条带有计数值的记录。

// This returns one record with the count
$total_races    = "SELECT COUNT(race_number) AS totalraces 
                   FROM race_info WHERE meetingID = ('".$safemeetingID."') ";

接下来,您将遍历相同的记录,因为为比赛详细信息返回的行与计数相同。

// This looks to return the record(s) with the race details
$race_details   = "SELECT * FROM race_info 
                    WHERE meetingID = ('" . $safemeetingID . "')";

我认为您可以使用它来获得所需的结果:(我同意将 $row 变量重命名为每个 while 循环的描述性)

$racedetails = mysql_query("SELECT *
FROM race_info
WHERE meetingID = ('" . $safemeetingID . "')");

while($details_row = mysql_fetch_array($racedetails))
{
    echo "<tr><td>Race " . $details_row['race_number'] . " at " . $details_row['start_time'] . " " . $details_row['class'] . " over " . $details_row['distance'] . "m</td></tr>";

    $racecard = mysql_query("SELECT *
    FROM race_form
    INNER JOIN race_info ON race_form.raceID = race_info.raceID
    WHERE race_form.raceID = ('" . $details_row['raceID'] . "')");

    while($rc_row = mysql_fetch_array($racecard))
    {
    echo "<tr><td>" . $rc_row['number'] . "</td><td>" . $rc_row['past10'] . "</td><td>" . $rc_row['horse_name'] . "</td></tr>";
    }

    echo "</table><br>";

    echo "Testing<br>Testing<br>I wish I could put in some horse form here...<br>";

    echo "<table width='990' border='1' cellspacing='2' cellpadding='2'>";

}

未经测试/伪代码

"SELECT * 
FROM horses AS h, 
INNER JOIN race_info  AS ri ON race_form.raceID = race_info.raceID
WHERE horse_name IN (
    SELECT horse_name
    FROM race_form AS srf
    WHERE h.horse_name = srf.horse_name
)
AND race_form.raceID = ('" . $details_row['raceID'] . "')"

这个想法是将两个查询合并为一个,我知道这不是正确的语法,但它可能会让你知道如何去做。

或者你可以在while循环中查询马的名字

$racedetails = mysql_query("SELECT *
FROM race_info
WHERE meetingID = ('" . $safemeetingID . "')");

while($details_row = mysql_fetch_array($racedetails))
{
    echo "<tr><td>Race " . $details_row['race_number'] . " at " . $details_row['start_time'] . " " . $details_row['class'] . " over " . $details_row['distance'] . "m</td></tr>";

    $racecard = mysql_query("SELECT *
    FROM race_form
    INNER JOIN race_info ON race_form.raceID = race_info.raceID
    WHERE race_form.raceID = ('" . $details_row['raceID'] . "')");

    while($rc_row = mysql_fetch_array($racecard))
    {
        echo "<tr><td>" . $rc_row['number'] . "</td><td>" . $rc_row['past10'] . "</td><td>" . $rc_row['horse_name'] . "</td></tr>";

        $horses = mysql_query("SELECT *
        FROM horses
        WHERE horse_name = ('" . $rc_row['horse_name'] . "')");

        while($horse_row = mysql_fetch_array($horses))
        {
            // echo horse details here
        }
    }

    echo "</table><br>";

    echo "Testing<br>Testing<br>I wish I could put in some horse form here...<br>";

    echo "<table width='990' border='1' cellspacing='2' cellpadding='2'>";

}

【讨论】:

  • 感谢它以更好的方式完成了同样的工作。现在我唯一的问题是如何在每场比赛的下方显示赛马卡中列出的每匹马的详细信息,如果这有意义的话?这意味着从 horse 表中获取每匹马的信息 - horses 和 race_form 表都有一个 horse_name 字段来加入它们
  • 嘿 Phill,最后一段代码几乎做到了,但它把 $horses 信息放在 $racedetails 信息之上,而不是在它之下。
  • 我会把这个打勾为回答,因为你已经让我欢呼了
【解决方案3】:

我理论你可以,实际上你可以,但是while 中的while 中的for 中的while 似乎有点在顶部...

如果您解释一下您要做什么,我相信我们可以帮助您提高效率。

【讨论】:

  • 好的,我会尝试解释。我有 5 个表 - race_meetings 记录了会议,即日期轨迹等,race_info 记录了每场比赛,即距离、上课时间、race_form,记录了即将举行的比赛中每个跑步者的骑师障碍重量等, horses 包含每匹马的详细信息和race_results,此处未使用...我想显示即将举行的会议、第 1 场比赛的信息、下面第 1 场比赛中的跑步者列表,以及下面那场比赛中每匹马的更多详细信息。那么第 2 场比赛也是如此……这样更清楚吗?
  • 也许有更好的方法来使用更多的连接来优化您的查询?您可能需要嵌套循环,因为这在 2-3 次查询的 db 查询中很常见,但更多似乎过多。
  • 你的意思是我应该在 while/for 循环之前做一个大查询加入我的所有表,然后在循环中调用它?
  • 不是 1 个查询,但 JOINs 可能很聪明。将查询放在循环之外也很聪明,因为查询很昂贵。现在你需要 1*5*5 的查询。您可以将其优化为 1+5+5 查询(给予或接受)。
  • 数据结构会有很大帮助:外键在哪里以及它们是如何相关的?另外:如果您指定您的问题,请在原始位置进行(您可以编辑),这样您就可以使用更多样式,有更多空间并且它总是“在那里”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-02
  • 2016-11-27
  • 1970-01-01
  • 1970-01-01
  • 2016-04-24
  • 1970-01-01
  • 2022-01-16
相关资源
最近更新 更多