我试图从MySQL数据库中显示国家明智的城市细节,其中包含大约1000万行的庞大数据库。我创建了以下代码,工作正常。然而,在显示时,由于MySQL中的庞大数据库,它需要花费大量时间。任何人都可以帮我写替代嵌套循环,因为看起来嵌套循环是一个需要花费大量时间的循环。此代码的目的是以UL和LI格式显示州名及其相应的城市。一个替代方案似乎按字母顺序分析结果。欢迎任何其他建议:
这是我的代码:
DisplayFormat:
<ul>State1
<li>City1</li>
<li>City3</li>
<li>City3</li>
<li>City4</li>
</ul>
<ul>State2
<li>City1</li>
<li>City3</li>
<li>City3</li>
<li>City4</li>
</ul>
<ul>State3
<li>City1</li>
<li>City3</li>
<li>City3</li>
<li>City4</li>
</ul>
PHP CODE:
function cityListings(){
global $conn;
$state="SELECT DISTINCT state FROM members";
$query=mysqli_query($conn,$state);
while($row=mysqli_fetch_assoc($query))
{
$state=$row['state'];
?>
<div>
<ul>
<?php echo $state; ?>
<?php city($state); ?>
</ul>
</div>
<?php }
}
function city($state){
global $conn;
$city="SELECT DISTINCT city from members WHERE state='$state'";
$query=mysqli_query($conn,$city);
while($row=mysqli_fetch_assoc($query))
{
$city=$row['city'];
?>
<a href="city.php?city=<?php echo $city; ?>" style="text-decoration:none;">
<li style="color:blue;">
<?php echo $city; ?>
</li>
</a>
<?php }
}
答案 0 :(得分:0)
首先,您必须在字段state
上的数据库中拥有索引才能进行快速搜索。这个可以大大加快你的要求。
其次,您可以在一个请求中请求所有需要的数据,而不是枚举它们。如果您不想按城市名称排序,则必须在字段state
和city
上为此代码设置索引,或者至少在state
上设置索引(在这种情况下,从ORDER部分删除城市)
function cityListings(){
global $conn;
$state="SELECT DISTINCT state, city FROM members ORDER BY state, city"; // select all distinct pairs (city, state)
$query=mysqli_query($conn,$state);
$prev_state = null;
while($row=mysqli_fetch_assoc($query))
{
$state=$row['state'];
$city=$row['city'];
if( $state != $prev_state ) // new state begins
{
if( $prev_state != null ) // close previous state block
{
echo( '</ul></div>' );
}
echo( '<div><ul>'.$state ); // begin new state block
$prev_state = state;
}
?>
<a href="city.php?city=<?php echo $city; ?>" style="text-decoration:none;">
<li style="color:blue;">
<?php echo $city; ?>
</li>
</a>
<?php
}
if( $prev_state != null ) // close last state block
{
echo( '</ul></div>' );
}