我是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循环显示结果。我无法清楚地理解它。
如果有人可以为我解释这个问题以及我如何能够按照上面的要求进一步分组州和城市,我将非常感激?
答案 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, '}';
}