【问题标题】:Preventing MySQL Queries in PHP while loops? (Use one instead)防止 PHP while 循环中的 MySQL 查询? (改用一个)
【发布时间】:2013-05-13 03:26:39
【问题描述】:

这是我的桌子...

Locations
__________________________________________________________
ID          Location           Region             Country

1           Newmarket          Ontario            Canada
2           Barrie             Ontario            Canada
3           New York City      New York           US
4           Buffalo            New York           US
5           Vancouver          British Columbia   Canada


Regions
__________________________________________________________
ID          Region               Country

1           Ontario              Canada
2           New York             US
3           British Columbia     Canada


Countries
__________________________________________________________
ID           Country

1            Canada
2            US

表格比这大得多,我正在尝试将列表加载到可扩展的列表中......

样式没问题,我已经解决了。我只是试图在一个快速的 MySQL 查询中加载所有这些信息。这就是我目前在 PHP 中所拥有的,它需要使用这些 while 循环进行大量查询。 (以我的桌子大小)

    <div id="listContainer">
        <ul id="expList">
                <?php
                $countries = $conn->query("SELECT * FROM countries ORDER BY country ASC");
                while($crow = mysqli_fetch_array($countries))
                {   
                    $cname = $crow['country'];
                    $regions = $conn->query("SELECT * FROM regions WHERE country = '$cname' ORDER BY region ASC")
                    ?>
                    <li class="country">
                    <?php echo $cname; ?>
                        <ul class="undercountry">
                                <?php
                                while($rrow = mysqli_fetch_array($regions))
                                {
                                echo "<li>";
                                $rname = $rrow['region'];
                                echo $rname;
                                ?>
                                    <ul>
                                        <?php
                                        $locations = $conn->query("SELECT * FROM locations WHERE region = '$rname' AND country = '$cname' ORDER BY location ASC");
                                        while($lrow = mysqli_fetch_array($locations)){
                                            $lname = $lrow['location'];
                                            echo $lname;
                                        }
                                        ?>
                                    </ul>
                                <?php
                                echo "</li>";
                                }
                                ?>
                        </ul>
                    </li>
                    <?php
                }
                ?>
            </ul>
        </div>

有没有办法做到这一点?只使用位置表和组是可以的,但我不太擅长编写选择查询。

【问题讨论】:

  • 您的位置表中已包含国家和地区。为什么不只使用一张表,而不是其他表中的冗余信息?
  • 我知道有这样的表格看起来很奇怪,但我需要它们用于其他用途。

标签: php html mysql sql


【解决方案1】:

由于您的位置表也包含国家和地区的所有信息,因此您无需使用其他表。您可以像这样运行查询:

SELECT * FROM locations ORDER BY country, region

这将返回一个按国家和地区排序的数组。然后你可以循环这个来创建你的select 元素。这是一个根据需要打印结果的示例。根据需要修改:

<?php

// example results
$results = array(
    array(
        'Location' => 'Vancouver',
        'Region' => 'British Columbia',
        'Country' => 'Canada'
    ),
    array(
        'Location' => 'New Market',
        'Region' => 'Ontario',
        'Country' => 'Canada'
    ),
    array(
        'Location' => 'Barrie',
        'Region' => 'Ontario',
        'Country' => 'Canada'
    ),
    array(
        'Location' => 'New York City',
        'Region' => 'New York',
        'Country' => 'US'
    )
);

$i = 0;

while ($i < count($results)) {
    $currentCountry = $results[$i]['Country'];
    echo "-" . $currentCountry . PHP_EOL;

    while ($results[$i]['Country'] == $currentCountry) {
        $currentRegion = $results[$i]['Region'];
        echo "--" . $currentRegion . PHP_EOL;

        while ($results[$i]['Region'] == $currentRegion) {
            echo "---" . $results[$i]['Location'] . PHP_EOL;
            $i++;
            if ($i == count($results)) break;
        }

        if ($i == count($results)) break;       
    }   
}

这样你只需要运行一个 SQL 查询。

Demo

【讨论】:

    【解决方案2】:

    您可以将所有表合并到一个联接中,然后只运行一次查询并遍历所有行。在循环中,跟踪比较值以检查国家、地区或位置是否已更改,并相应地选择和设置输出样式。

    select * from locations l, regions r, countries c
    where r.country = c.country and l.region = r.region
    order by c.country, r.region, l.location
    

    【讨论】:

      猜你喜欢
      • 2023-03-30
      • 2014-11-29
      • 2013-11-23
      • 2013-03-11
      • 1970-01-01
      • 2020-06-04
      • 2012-09-05
      • 1970-01-01
      • 2017-06-01
      相关资源
      最近更新 更多