За последние 24 часа нас посетили 19324 программиста и 1607 роботов. Сейчас ищут 953 программиста ...

UPDATE таблицы смежностей

Тема в разделе "MySQL", создана пользователем Николай++, 22 июл 2013.

  1. Николай++

    Николай++ Новичок

    С нами с:
    20 июл 2013
    Сообщения:
    7
    Симпатии:
    0
    Добрый день!

    Есть таблица смежностей следующего вида:
    Код (Text):
    1.  
    2. CREATE TABLE `test` (
    3. `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
    4. `parent_id` INT UNSIGNED NOT NULL DEFAULT '0',
    5. `counter` INT UNSIGNED NOT NULL DEFAULT '0',
    6. .....
    7. PRIMARY KEY (`id`)
    8. )  ENGINE=MyISAM CHARACTER SET `utf8`;
    В поле counter содержится количество потомков для данного родителя.
    В результате перемещений от одного к другому counter уже не соответствует действительности.
    Как построить запрос UPDATE для всей таблицы, чтобы это поле привести в соответствие?
     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    боюсь одним update задача не решается.
     
  3. Николай++

    Николай++ Новичок

    С нами с:
    20 июл 2013
    Сообщения:
    7
    Симпатии:
    0
    уточню
    counter не количество всех наследников по дереву, а именно потомков (на уровень ниже)
    т.е. counter = количество потомков у которых parent_id равен id родителя.
     
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    а, ну тогда как в анекдоте: "это х*ня, а х*ню мы не лечим" )))
    у самого то какие соображения на этот счет? что именно не получается?
     
  5. Николай++

    Николай++ Новичок

    С нами с:
    20 июл 2013
    Сообщения:
    7
    Симпатии:
    0
    Все бы хорошо, да вот таблица одна и что-то типа:

    Код (Text):
    1.  
    2. UPDATE `test` t1 SET t1.`counter`=(SELECT COUNT(*) FROM `test` t2 WHERE t2.`parent_id`=t1.`id`)
    уже не пройдёт.
     
  6. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    Код (Text):
    1. UPDATE `al_tree` AS `t1`
    2. LEFT JOIN (
    3.   SELECT `parent_id`, COUNT(*) AS `counter`
    4.   FROM `al_tree`
    5.   GROUP BY `parent_id`
    6. ) AS `t2` ON `t1`.`id`=`t2`.`parent_id`
    7. SET `t1`.`counter`=IFNULL(`t2`.`counter`, 0)
    LEFT JOIN здесь нужен, т.к. не у всех узлов есть потомки и при INNER JOIN такие узлы не изменят свой counter. нюанс!

    http://sqlfiddle.com/#!2/55afd6/2
     
  7. Николай++

    Николай++ Новичок

    С нами с:
    20 июл 2013
    Сообщения:
    7
    Симпатии:
    0
    Огромное Спасибо!