在MYSQL PHP中对城市,州和国家进行分组

时间:2011-09-02 11:03:50

标签: php mysql multidimensional-array group-by

我是PHP新手并为此访问了多个网站,但似乎无法彻底理解。

我有这个问题:

$result = mysql_query
  ("SELECT Country, State, City
       FROM Address_Base
       ORDER BY Country, State, City")
  or die(mysql_error());

这给出了以下数据样本:

  

加拿大 - 州1 - 城市苹果

     

加拿大 - 州2 - 城市葡萄

     

加拿大 - 州1 - 城市苹果

     

加拿大 - 州2 - 城市咖啡

     

美国 - 州1 - 城市斑马

     

美国 - 州2 - 城市猫

     

美国 - 州2 - 城市狮子

     

美国 - 州3 - 城市鸟

     

美国 - 州1 - 城市斑马

我的目标是将各州的城市分组并统计城市,将各州和各州分组。将类似的国家/地区分组并生成类似的内容

Canada -
{
  State 1 - City Apple (2)
  State 2 - City Coffee (1), City Grapes (1)
}

USA -
{
    State 1 - City Zebra (2)
    State 2 - City Cat (1), City Lion (1)
    State 3 - City Bird (1)
}

从其他网站,我得到了这个:

$combinedResults = array();

while ($rec=mysql_fetch_assoc($result))
{
    $combinedResults[$rec['Country']][] = array
            (               
                'S' => $rec['State'], 
                'C' => $rec['City']
            );                           
}

foreach(array_keys($combinedResults) as $Country)
{ 
    echo '<div class="country">'.$Country.'</div>';

    foreach($combinedResults[$Country] as $Set)
    { 
        echo $Set['S'].'<br/>'.$Set['C'].'<br/><br/>'; 
    } 
} 

这只对相似的国家/地区,而不是州和城市进行分组。我想上面的代码试图在某种多维数组中预处理数据并使用for循环显示结果。我无法清楚地理解它。

如果有人可以为我解释这个问题以及我如何能够按照上面的要求进一步分组州和城市,我将非常感激?

2 个答案:

答案 0 :(得分:1)

SQL查询将为您提供一组具有固定列数的结果。您的示例具有可变数量的列(多个城市计数),因此这不起作用。

您可以在SQL中使用COUNT和GROUP BY来获得类似

的内容
Country   State    Citiescount
Canada    state1      4
Canada    state2      3
USA       state2      2

等,但左手栏中会有重复。

  SELECT country, state, COUNT(cities)
    FROM address_base
GROUP BY country, state

为了摆脱重复,循环它以使多维数组做类似的事情

$countries = array();
foreach ($results as $row) {
    if (!isset($countries[$row->country])) {
        $countries[$row->country] = array();
    }
    $countries[$row->country][$row->state] = $row->citiescount;
}

或者,您可以回复这些内容。您可以像这样一次获得所有结果并循环遍历整个集合,或者您可以将其分解为较小的查询,并为每个国家/地区执行一个或每个州运行一个。但是,请注意,将SQL放入循环会导致小猫(和DB性能)崩溃:)。

答案 1 :(得分:1)

$result = mysql_query('SELECT Country, State, City From Address_Base ORDER BY Country, State, City') or die(mysql_error());

$countries = array();

// fetch results and build multidimensional array of city counts
while($row = mysql_fetch_array($result, MYSQL_ASSOC)){
    if(isset($countries[$row['Country']][$row['State']][$row['City']])){
        $countries[$row['Country']][$row['State']][$row['City']] += 1;
    } else{
        $countries[$row['Country']][$row['State']][$row['City']] = 1;
    }
}

// loop over all countries
foreach($countries as $country => $states){
    echo $country, PHP_EOL, '{'; // output country start

    // loop over all states
    foreach($states as $state => $cities){
        echo $state, ' - '; // output state start

        $cityCounts = array();
        foreach($cities as $city => $count){
            $cityCounts[] = $city.' ('.$count.')'; // add all city counts to array
        }

        // implode all city counts and output it
        echo implode(', ', $cityCounts);

        // output new line
        echo PHP_EOL;
    }

    // output country end
    echo PHP_EOL, '}';
}