Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Рекурсивный подсчёт
 
 автор: serenya1983   (12.02.2011 в 11:23)   письмо автору
 
 

Есть табица комментариев:
CREATE TABLE IF NOT EXISTS `Comment` (
`Id` int(11) NOT NULL AUTO_INCREMENT,
`ParentId` int(11) NOT NULL,
...
) ENGINE=InnoDB

необходимо рекурсивно подсчитать количество комментариев, при этом комментарий может быть снова прокомментирован, т.е.
Комментарий 1
Комментарий 1 1
Комментарий 1 2
Комментарий 1 2 1
Комментарий 1 2 2
Комментарий 1 3

и т.д.!
В Id хранится идентификатор комментария в ParentId - ссылка на Id соответственно.
Хотел хранимыми функциями или процедурами но пишет нельзя их использовать рекурсивно.

  Ответить  
 
 автор: cheops   (12.02.2011 в 11:52)   письмо автору
 
   для: serenya1983   (12.02.2011 в 11:23)
 

Хм... странно, вообще-то хранимые процедуры можно использовать рекурсивно.

  Ответить  
 
 автор: serenya1983   (12.02.2011 в 11:59)   письмо автору
 
   для: cheops   (12.02.2011 в 11:52)
 

вот ошибка при вызове рекурсивно:
Recursive stored functions and triggers are not allowed.
CREATE FUNCTION `_CountComment` (_ParentId BIGINT) RETURNS INT
BEGIN
    DECLARE mCount INT DEFAULT 0;
    DECLARE done INT DEFAULT 0;
    DECLARE sId BIGINT DEFAULT 0;
    DECLARE rCount INT DEFAULT 0;

    DECLARE rCursor CURSOR FOR SELECT Id FROM Comment  WHERE ParentId=_ParentId;
    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;
    
    OPEN rCursor;
    FETCH rCursor INTO sId;
    WHILE done = 0 DO
        SELECT _CountComment(sId) INTO rCount;
        SET mCount=mCount+1+rCount;
        FETCH rCursor INTO sId;
    END WHILE;
    CLOSE rCursor;

    RETURN mCount;
END

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования