这段代码工作正常,但我不喜欢循环中while循环的想法。
JOINS有另一种方式可以更有效地工作吗?
$region_results = mysql_query("SELECT id,region_name FROM regions WHERE page_id='$page_id' ORDER BY position ASC",$con_web) or die (mysql_error());
while($region_rows=mysql_fetch_array($region_results))
{
$region_id=$region_rows["id"];
$region_name=$region_rows["region_name"];
echo " <li>$region_name\n";
echo " <ul>\n";
$block_results = mysql_query("SELECT id,block_name FROM blocks WHERE region_id='$region_id' ORDER BY position ASC",$con_web) or die (mysql_error());
while($block_rows=mysql_fetch_array($block_results))
{
$block_id=$block_rows["id"];
$block_name=$block_rows["block_name"];
echo " <li>$block_name\n";
echo " <ul>\n";
$object_results = mysql_query("SELECT id,object_name FROM objects WHERE block_id='$block_id' ORDER BY position ASC",$con_web) or die (mysql_error());
while($object_rows=mysql_fetch_array($object_results))
{
$object_id=$object_rows["id"];
$object_name=$object_rows["object_name"];
echo " <li>$object_name</li>\n";
}
echo " </ul>\n";
echo " </li>\n";
}
echo " </ul>\n";
echo " </li>\n";
}
此代码生成:
<li>Left Content
<ul>
<li>Block 1
<ul>
<li>Object 1</li>
</ul>
</li>
<li>Block 2
<ul>
<li>Object 1</li>
</ul>
</li>
<li>Block 3
<ul>
<li>Object 1</li>
</ul>
</li>
</ul>
</li>
<li>Right Panel
<ul>
<li>Block 1
<ul>
<li>Object 1</li>
<li>Object 2</li>
</ul>
</li>
</ul>
</li>
谢谢。
答案 0 :(得分:1)
SELECT b.id AS block_id, b.block_name, o.id, o.object_name
FROM blocks b
JOIN objects o
ON o.block_id = b.id
WHERE b.region_id = '$region_id'
ORDER BY
b.position, b.id, o.position
记录block_id
的值,并在块标记发生变化时关闭/打开它。
答案 1 :(得分:0)
在whiles内有什么问题?除非他们不能保证结束,如果你能通过一次查询来避免它们,我认为没有任何问题。
也许您应该使用more high level API来完成这项工作。那对你的代码来说会更好。
答案 2 :(得分:0)
嵌套的WHILE循环不是一个效率问题。我认为您的问题更多的是您正在对DB进行大量单独调用,如果将它们组合在一起可能会更有效。
尝试使用连接将查询组合到单个查询中,然后遍历检测分组何时更改的行。