Добрый день! Есть таблица смежностей следующего вида: Код (Text): CREATE TABLE `test` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, `parent_id` INT UNSIGNED NOT NULL DEFAULT '0', `counter` INT UNSIGNED NOT NULL DEFAULT '0', ..... PRIMARY KEY (`id`) ) ENGINE=MyISAM CHARACTER SET `utf8`; В поле counter содержится количество потомков для данного родителя. В результате перемещений от одного к другому counter уже не соответствует действительности. Как построить запрос UPDATE для всей таблицы, чтобы это поле привести в соответствие?
уточню counter не количество всех наследников по дереву, а именно потомков (на уровень ниже) т.е. counter = количество потомков у которых parent_id равен id родителя.
а, ну тогда как в анекдоте: "это х*ня, а х*ню мы не лечим" ))) у самого то какие соображения на этот счет? что именно не получается?
Все бы хорошо, да вот таблица одна и что-то типа: Код (Text): UPDATE `test` t1 SET t1.`counter`=(SELECT COUNT(*) FROM `test` t2 WHERE t2.`parent_id`=t1.`id`) уже не пройдёт.
Код (Text): UPDATE `al_tree` AS `t1` LEFT JOIN ( SELECT `parent_id`, COUNT(*) AS `counter` FROM `al_tree` GROUP BY `parent_id` ) AS `t2` ON `t1`.`id`=`t2`.`parent_id` SET `t1`.`counter`=IFNULL(`t2`.`counter`, 0) LEFT JOIN здесь нужен, т.к. не у всех узлов есть потомки и при INNER JOIN такие узлы не изменят свой counter. нюанс! http://sqlfiddle.com/#!2/55afd6/2