У меня проблемы с решением итеративных 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
штатов / стран, так как они бесполезно занимали место )