Группировка городов, штатов и стран в MYSQL PHP - PullRequest
1 голос
/ 02 сентября 2011

Я новичок в PHP и посетил несколько сайтов для этого, но, похоже, не совсем понял.

У меня есть этот запрос:

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

Это дает следующую выборку данных:

Канада - Штат 1 - Город Яблоко

Канада - Штат 2 - Город Виноград

Канада - Штат 1 - Город Apple

Канада - Штат 2 - Городской кофе

США - Штат 1 - Город Зебра

США - Штат 2 - Городской кот

США - Штат 2 - Город Лев

США - штат 3 - City Bird

США - Штат 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 ]

1 голос
/ 02 сентября 2011
$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, '}';
}
1 голос
/ 02 сентября 2011

SQL-запросы предоставят вам набор результатов с фиксированным количеством столбцов.В вашем примере есть переменное количество столбцов (количество городов), поэтому это не сработает.

Вы можете использовать COUNT и GROUP BY в SQL, чтобы получить что-то вроде

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 убивает котят (и производительность БД):).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...