我在解决迭代 SQL 查询的问题(我需要取消它)时遇到了麻烦,我正在尝试找出一个替代方案。
(另外;不幸的是,AJAX 并不适合)
鉴于我有以下位置数据表:
Country
country_id
name
State
state_id
country_id
name
City
city_id
state_id
name
现在,我正在尝试提取所有数据,但它实际上非常小(147 个城市,分布在 64 个州,分布在 2 个国家/地区)但是它需要很长时间,因为我在迭代循环:
// this is pseudo-code, but it gets the point across
$countries = getCountries();
foreach($countries as &$country){
$country['states'] = $states = getStates($country['country_id']);
foreach($states as &$state){
$state['cities'] = getCities($state['state_id']);
}
}
我这样做的原因是因为我的最终结果集需要采用以下形式:
$countries = array(
array(
'name' => 'country_name',
'id' => 'country_id',
'states' => array(
array(
'name' => 'state_name',
'id' => 'state_id',
'cities' => array(
array(
'name' => 'city_name',
'id' => 'city_id',
),
// ... more cities
),
),
// ... more states
),
),
// ... more countries
);
我似乎无法绕过更快的方法。查询分层数据有哪些替代方法?
修改:
$sql = "SELECT
`dbc_country`.`name` as `country_name`,
`dbc_state`.`name` as `state_name`,
`city_id`,
`dbc_city`.`name` as `city_name`,
`latitude`,
`longitude`
FROM
`dbc_city`
INNER JOIN
`dbc_state` ON `dbc_city`.`state_id` = `dbc_state`.`state_id`
INNER JOIN
`dbc_country` ON `dbc_state`.`country_id` = `dbc_country`.`country_id`";
$locations = array();
foreach($datasource->fetchSet($sql) as $row){
$locations[$row['country_name']][$row['state_name']][] = array(
$row['city_id'],
$row['city_name'],
$row['latitude'],
$row['longitude'],
);
}
(我还删除了id
州/国家/地区的值,因为它们无用地占用了空间)