这是我的表......
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>
有办法做到这一点吗?只使用位置表和组是可以的,但我不太擅长编写选择查询。
答案 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查询。
答案 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