2013-05-12 76 views
-2

这里是我的表...在循环中阻止PHP中的MySQL查询? (使用一个替代)

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> 

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

+0

您的位置表中已经有该国家和地区。你为什么不使用一张表,而不是其他表中的冗余信息? – 2013-05-12 19:27:04

+0

我知道有这样的桌子似乎很奇怪,但我需要它们用于其他用途。 – TJE 2013-05-12 19:36:44

回答

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

+0

谢谢! :) – TJE 2013-05-12 19:47:12

-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