-2

这是我的桌子...

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>

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

4

2 回答 2

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 查询。

演示

于 2013-05-12T19:26:31.100 回答
-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
于 2013-05-12T19:25:36.703 回答