PHP / SQL替代嵌套while循环中的db调用

时间:2012-05-30 23:14:12

标签: php sql-server loops while-loop

我的第一篇文章,试图尽可能彻底,如果我出错了,请提前道歉。我对PHP / SQL也很新手,所以请耐心等待我。我在循环中发现了几个关于循环的类似问题,但我不确定这些解决方案是否适用于我的情况。

我有两张桌子,tws_workshopNames和tws_workshops。 tws_workshopNames中的主键用作tws_workshops中的外键,用于关联两个表。我将其分成两个表的原因是,在许多情况下,在多个日期/时间提供相同的工作室名称/价格/描述。

无法提交屏幕截图,但这里是SQL Server中表格设计的简化大纲:

tws_workshopNames:
workshopNameID (pri)
description
price
etc.

tws_workshops:
workshopID (pri)
workshopNameID (foreign)
date
time
etc.

我想要发生的事情基本上是这样的:

  1. 查询tws_workshopNames表并显示workshopName / price / description / etc.
  2. 每个workshopName的
  3. 通过tws_workshops表并显示具有相同workshopNameID的所有记录
  4. 换句话说,浏览tws_workshopNames并显示第一个workshopName,然后浏览tws_workshops并显示与该workshopName相关的所有记录,然后转到tws_workshopNames中的下一个workshopName,显示与该workshopName相关的所有记录等。

    我可以通过在while循环中使用while循环来实现所需的结果,其中外循环调用tws_workshopNames并且嵌套循环调用tws_workshops表。不过我已经阅读了很多关于这一点的内容,很明显这不是一个好方法,因为它会导致对数据库的大量调用,但我很难理解任何替代方案。

    期望的输出:

    Workshop 1
    price
    description
     date (of workshop 1)
     time (of workshop 1)
     ...
    
    Workshop 2
    price
    description
     first date (of workshop 2)
     first time (of workshop 2)
     second date (of workshop 2)
     second time (of workshop 2)
     third date (of workshop 2)
     third time (of workshop 2)
     ...
    
    Workshop 3
    price
    description
     date (of workshop 3)
     time (of workshop 3)
     ...
    
    etc.
    

    以下是使用嵌套while循环的当前代码:

    <?php
    // query workshopNames table, what types of workshops are available?
    $query = mssql_init("tws_sp_workshopNames", $g_dbc);
    
    // pull up result
    $result = mssql_execute($query);
    $numRows = mssql_num_rows($result);
    
    while($row = mssql_fetch_array($result)) {
    
    echo "<div style=\"...\">
    <span class=\"sectionHeader\">" . $row['workshopName'] . "</span><br />
    <span class=\"bodyText\"><strong>" . $row['price'] . "</strong></span><br />
    <span class=\"bodyText\">" . $row['description'] . "</span>";
    
    $workshopNameID = $row['workshopNameID'];
    
    // query workshops table, what are the dates/times for each individual workshop?
    $query2 = mssql_init("tws_sp_workshops", $g_dbc);
    mssql_bind($query2, "@workshopNameID", $workshopNameID, SQLVARCHAR);
    
    //pull up result
    $result2 = mssql_execute($query2);
    $numRows2 = mssql_num_rows($result2);
    
    while($row2 = mssql_fetch_array($result2)) {
    
    echo $row2[date] . "&nbsp;";
    echo $row2[time] . "<br />";
    
    };
    
    echo "</div><br />";
    
    };
    ?>
    

    存储过程非常简单:

    tws_sp_workshopNames = "SELECT workshopNameID, workshopName, description, location, price FROM tws_workshopNames"
    tws_sp_workshops = "SELECT date, time, maxTeachers, maxStudents, teachersEnrolled, studentsEnrolled FROM tws_workshops WHERE workshopNameID=@workshopNameID"
    

    希望这一切都比较清楚,我真正想要的是获得相同结果的更好方法,即在循环中不涉及db调用的解决方案。

    提前感谢您提供任何帮助,连续几天就撞到了这个......

2 个答案:

答案 0 :(得分:0)

我认为你做事的方式没有任何问题。我想您可以连接结果,然后使用一个查询操作应用程序中的输出。您的查询可能类似于

SELECT
    n.workshopNameId,
    n.price,
    n.description,
    GROUP_CONCAT(w.date) as dates,
    GROUP_CONCAT(w.time) as times
FROM tws_workshopNames n
INNER JOIN tws_workshops w USING(workshopNameID)
GROUP BY n.workshopNameID

答案 1 :(得分:0)

在这种情况下,避免使用循环查询是正确的(因为只需在一个查询中使用简单的JOIN就可以实现所需的结果)。

我也会避免使用GROUP_CONCAT(),因为有一个字符限制(默认情况下,你可以更改它),而且你必须解析它输出的数据,这是一种痛苦。我会通过加入获得您需要的所有数据并获得每一行。然后使用Workshop ID作为键将数据加载到数组中,但保持数组打开以将每个时间数据附加为新数组:

$workshops[$workshop_name][] = $timesArray;

然后在你的输出上你可以循环,但你不必在每次通话时点击数据库:

foreach ($workshops as $workshop_name => $times)
{
  echo $workshop_name;
  foreach ($times as $time)
  {
    echo $time;
  }
  echo "<br>";
}

这不是确切的代码,正如您在问题中指出的那样,您希望保留/显示有关研讨会的其他信息 - 只需使用数组结构,直到获得所有数据为止在层次结构中需要。如果您正在尝试构建深层树结构,则可以使用http://kevin.vanzonneveld.net/techblog/article/convert_anything_to_tree_structures_in_php/之类的内容,但我认为这个例子有点过分。

因为这就是我所说的&#34;中级&#34;问题,我认为你应该尝试使用我的建议(这是使你成为一名优秀的程序员,而不是复制/粘贴)。如果您遇到困难,请发表评论,我会进一步帮助您。