2011-09-02 3 views
1

Я новичок в PHP и побывал на нескольких сайтах для этого, но, похоже, не понимаю их полностью.Группировка городов, штатов и стран в MYSQL PHP

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

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

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

Canada - State 1 - City Apple

Canada - State 2 - City Grapes

Canada - State 1 - City Apple

Canada - State 2 - City Coffee

USA - State 1 - City Zebra

USA - State 2 - City Cat

USA - State 2 - City Lion

USA - State 3 - City Bird

USA - State 1 - City Zebra

Моя цель состоит в группе города под соответствующим государством и сосчитать город, группа государства под соответствующая страна & группа аналогичных стран и произвести что-то подобное

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/>'; 
    } 
} 

Это только группы, подобные стран, а не государство и город. Я думаю, что вышеприведенный фрагмент кода пытается предварительно обработать данные в каком-то многомерном массиве и отобразить результаты для цикла. Я не могу понять это ясно.

Я был бы очень благодарен, если бы кто-нибудь мог объяснить это мне и как я могу дальше группировать штаты и города соответственно, как указано выше?

ответ

1

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

+0

@Matt ... Я попробовал группу ... поскольку она использовалась с использованием агрегатных функций ... не помогает в достижении целевого отображения. Более того, два города могут иметь одно и то же имя, но разные штаты в США ..., я попробовал Group By zip-codes .... но я обнаружил, что почтовый индекс США может быть одинаковым в Мексике. Это создает проблему для меня. Поэтому я сбросил этот маршрут. – Tede

+0

GROUP BY не должно вызывать проблемы с повторяющимися значениями, если вы получаете предложения в правильном порядке и включаете их все. В приведенном выше примере я сначала помещаю страну, так что вы получите вещи, сгруппированные этим, а затем по штату внутри стран (по одной строке для каждого состояния, даже если имя такое же, если они находятся в разных странах). Я немного смущен тем, что вы в конечном счете считаете. Что означают цифры в скобках после названий городов? –

+0

номер в круглых скобках после названий городов дает мне общее количество того же города, указанного в государстве ... например: - в приведенном выше образце город «яблоко» появляется дважды под одним и тем же городом, поэтому - (2). Это то, что я считаю. – Tede

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, '}'; 
} 
+0

@Shef ..... Не могли бы вы рассказать об этой строке: $ countries [$ row ['Country']] [$ row ['State']] [$ row ['City']] + = 1 - – Tede

+0

@Tede: счетчик для города. Если индекс массива с именем города существует, он увеличит счетчик на единицу, в противном случае счетчик начнет с 1. – Shef

+0

Shef ... спасибо за ответ ... Когда я использую эту строку: $ countries [$ row ['Country ']] [$ row [' State ']] [$ row [' City ']] + = 1 ... это дает мне ошибку: «Undefined index». удаляя приращение «+», я могу достичь всего, на что нацеливаюсь, за исключением подсчета одних и тех же городов в состоянии. Еще одна вещь, которую я нахожу интересной, - это то, как вы кодировали динамическое многомерное создание массива. Я рад это видеть, но я не могу это понять. Я много искал в сети, но их было немного. В какую книгу я обращаюсь, или вы найдете время, чтобы объяснить это мне? – Tede

Смежные вопросы