Как заполнить таблицу параметрами городов и стран?

danneo

Честный
Регистрация
13 Ноя 2007
Сообщения
1.527
Реакции
121
Есть таблица городов, областей и стран, все в одной таблице, как категории: id, name, parentid.
Нужно перебрать все строки и заполнить еще два поля у каждой запии: childs, parents.
childs - перечисление всех id потомков. Например, для России будут id всех потомков - области, города. Для какой-нибудь области будут только id всех городов. У города будет 0.
parents - перечисление через запятую всех id родителей. Например, для Москвы будут id Области и Страны. Для области только id Страны. Для страны будет 0.
И так для каждой страны или, например, только у выборочных стран.

Никак не могу сообразить код, и даже принцип перебора, для такого пересчета значений. И так и этак. Все не то. Не умещается столько инфы в голове :)
 
Сформируй пример строчки таблицы, Я , как понял, она у тебя фильдеперсовая какая-то)
 
сделай выборку всех значений и сгруппируй по "parents", затем перебери все их и сформируй массив, а затем обнови записи. (если хочешь пример кода, то кинь несколько записей из бд)
 
What I think is you're doing (sorry, I'm an english speaking user). Here's what I have in the column id, country, city
1. Make sure you index everything so everything will be pretty fast
2. Select country
3. Select city where country = {selected country here}

Basically that's how the code will work.
 
Я не тестировал, но попробуй вот так
PHP:
<?php

function reindex($parentId, $tableName)
{
   // Выбрать записи, начиная из топ-уровня
   $rows = mysql_query("SELECT `id`, `parents` FROM `$tableName` WHERE `parentid` = {$parentId}");
   while ($row = mysql_fetch_assoc($rows)) {
     // Задать parents для каждого чилда у текущей записи
     mysql_query("UPDATE `$tableName` SET `parents` = '" . implode(',', array($row['parents'], $row['id'])) . "' WHERE `parentid` = {$row['id']}");
   
     // Добавить новые childs для каждого из парентов
     mysql_query("UPDATE `$tableName` SET `childs` = CONCAT(`childs`, ',', {$row['id']}) WHERE `id` IN ({$row['parents']})");

     // Спуститься на уровень ниже
     reindex($row['id']);
   }
}

// Название таблицы
$tableName = 'YOUR_TABLE';

// Очистить данные предыдущего индексирования
mysql_query("UPDATE `$tableName` SET `parents` = '', `childs` = ''");

// Сделать новый индекс
reindex(
   0, // Здесь нужно указать, какой parentid у самого верхнего уровня (0, -1 или еще что-то)
   $tableName
);
 
Назад
Сверху