【问题标题】:Alternative for Nested Loops in PHPPHP 中嵌套循环的替代方案
【发布时间】:2017-09-03 14:28:36
【问题描述】:

我正在尝试从包含大约 1000 万行的巨大数据库的 MySQL 数据库中显示各州的城市详细信息。我创建了以下工作正常的代码。但是,在显示时,由于 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 }
}

【问题讨论】:

  • 因为“状态”似乎在两个表中,您是否查看过 MySQL doc 只进行 一个 查询?
  • 您是否使用关键字DISTINCT on two columnsGroup By two columns 对SO 进行过任何研究?在发布问题之前,一定要疯狂地研究。我在这里闻到了重复的味道。请正确标记您的代码。
  • 是的。在这里提出问题之前,我尝试了解 MySQL 文档,但坦率地说,我对此了解不多,因此在这个论坛中寻求建议 :-)
  • @mickmackusa:是的,我尝试过两列对我不起作用。它总是只显示一个结果,即状态,并且不提取城市的数据。
  • 仅供参考:以任何标准衡量,1000 万行都不算大

标签: php mysql nested-loops


【解决方案1】:

首先,您必须在字段state 的数据库中建立索引,以便快速搜索。这可以大大加快您的要求。

其次,您可以在一个请求中请求所有需要的数据,然后枚举它们。对于此代码,您必须在字段 statecity 上具有索引,如果您不想按城市名称排序,则至少在 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>' );
}

【讨论】:

  • 我已经按字母顺序创建了状态分页,以减少 MySQL 数据库的负载,从那时起,我的代码大约需要 8 秒来渲染数据库中的数据,而您的代码或多或少花费了相同的时间来渲染来自数据库的数据。使用您的代码后,我觉得优化没有区别。我正在寻找更优化的代码,以便更快地呈现数据。感谢您的代码:-)
  • 要达到高速,首先必须改变数据库结构。例如,在单独的表中提取州和城市,并在成员表中用 id 替换它们(带有原因索引)。
  • 没错。这就是我实际上的想法,因为我找不到其他选择。感谢您的建议。因为为了州和城市而使用完整的数据库是没有意义的。我会努力的。感谢您抽出宝贵时间:-) 我接受您的回答,因为这是我迄今为止找到的可能解决方案 :-)
猜你喜欢
  • 2021-05-25
  • 2013-08-23
  • 1970-01-01
  • 2020-01-15
  • 2015-06-29
  • 2018-04-15
  • 1970-01-01
  • 2020-03-09
  • 1970-01-01
相关资源
最近更新 更多