在循环中防止PHP中的MySQL查询? (改用一个)

时间:2013-05-12 19:08:57

标签: php html mysql sql

这是我的表......

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

这些表比这个大得多,我试图将列表加载到可扩展列表中,如此...

List style

造型没问题,我已经整理好了。我只是试图在一个快速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>

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:-1)

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

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