我的第一篇文章,尽可能地做到尽可能详尽,如果我弄错了某些东西,请提前道歉。我是PHP/SQL的新手,请耐心等待。我发现了几个有关循环内循环的类似问题,但我不确定这些解决方案适用于我的情况。PHP/SQL在嵌套while循环中替代db调用
我有两个表,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.
我希望发生的基本上是这样的:
- 查询tws_workshopNames表显示workshopName /价格/说明/等。
- 每个workshopName经过tws_workshops表,并显示具有相同workshopNameID
换句话说所有记录,经过tws_workshopNames并显示第一workshopName,然后通过tws_workshops并显示相关的所有记录然后转到tws_workshopNames中的下一个workshopName,显示与该workshopName相关的所有记录。
我能够通过在while循环中使用while循环来实现期望的结果,其中外循环执行呼叫tws_workshopNames和嵌套循环调用tws_workshops表。不过,我一直在阅读很多关于这方面的内容,很明显这不是一个好方法,因为它会导致对db的很多调用,但我很难理解任何替代方法。
所需的输出:
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] . " ";
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 [email protected]"
希望这一切相对清晰,我真正想要的是获得相同结果的更好方法,即一个解决方案s不涉及循环内的数据库调用。
在此先感谢您的帮助,已经连续几天敲我的头这一个...
非常感谢这些信息。我曾经见过一些关于使用JOIN用于类似目的的提及,但很难理解它如何让我在需要的地方。绝对感谢你对自己的工作做出的评论,并且会这样做。显然我需要花一些时间来玩一般的数组。如果我遇到障碍,我会再次检查。干杯。 – washe
只是想想你真正想要的数据。你真的希望所有的时间都与车间名称和价格挂钩。标题只是一个显示问题。所以你希望你的结果查询包括所有时间(select * from times和LEFT JOIN the workshop table for names and prices)。当编写SQL查询,我往往决定哪个单个表将返回人数最多的记录,那么就LEFT JOIN需要匹配剩余的数据。根据我的经验,这种方法适用于大约80%的需要编写的SQL查询。再次 – solidau
感谢您的信息,试图通过工作的另一桩去希望回到这个很快。希望我可以放开这件事,直到我能回到它为止。 – washe