Новости
Документация
Download
Webboard
Поиск
FAQ/ЧаВо
Обратная связь




MySQL.RU - Webboard



Вернуться
Выбор с подуровнем и подсчет (Данил) 21/09/2011 - 20:49:20
      Re: Выбор с подуровнем и подсчет (Akina) 21/09/2011 - 21:35:10
      Re: Выбор с подуровнем и подсчет (Данил) 21/09/2011 - 22:10:30
      Re: Выбор с подуровнем и подсчет (Akina) 22/09/2011 - 10:09:30
      Re: ограничить выборку дочек 4-мя последними (Akina) 22/09/2011 - 10:11:11
      Re: Выбор с подуровнем и подсчет (Данил) 22/09/2011 - 13:27:29
      Re: Выбор с подуровнем и подсчет (Данил) 22/09/2011 - 13:55:17
      Re: Написал процедуру, но она не работает (Данил) 23/09/2011 - 09:40:30
      Re: УРА!!! ЗАРАБОТАЛО!!!! (Данил) 25/09/2011 - 10:52:44

> Original message text:
> From: Данил - 21/09/2011 - 20:49:20
> Subject:Выбор с подуровнем и подсчет
> -----------------
> Доброго!
>
> Есть таблица table с полями id и parent
> parent либо 0 - root, либо id в котором находится запись.
> Уровня только два - основная запись root, которая либо содержит дочки, либо нет. Дочки ссылаются только на id с parent = 0.
>
> Как выбрать все записи и посчитать сколько у каждого parent = 0 дочек? Можно ли сделать тоже самое + ограничить выборку дочек 4-мя последними(order by desc)?
> Можно ли все сделать в один запрос и как долго он будет работать? :)
> спасибо.
>


From: Данил - 25/09/2011 - 10:52:44
Subject:УРА!!! ЗАРАБОТАЛО!!!!
-----------------
ВСЕМ СПАСИБО!
разобрался немного :) не работает так как select до версии MySQL 5.0.18 в процедурах не работает.

Написал процедуру. Работает нормально проверил на 1000 записей 0,1 с.
Интересны варианты тестирования на большем количестве.
Если кто предложит более конструктивные варианты, буду благодарен.

DELIMITER $$

DROP Procedure IF EXISTS `get_table` $$
CREATE DEFINER = CURRENT_USER PROCEDURE `get_table`(
IN slimit INT,
IN elimit INT
)
BEGIN
DECLARE id_now mediumint(8) unsigned;
DECLARE pid_now mediumint(8) unsigned;
DECLARE i mediumint(8) unsigned DEFAULT 0;
DECLARE offset mediumint(8) unsigned DEFAULT 0;
DECLARE seek_end BOOLEAN DEFAULT FALSE;

DECLARE cur1 CURSOR FOR SELECT id, parent FROM `table1` WHERE parent = 0 ORDER BY id DESC;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET seek_end = TRUE;

CREATE TEMPORARY TABLE IF NOT EXISTS `temp_table` (
`num` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`id` mediumint(8) unsigned NOT NULL,
`parent` mediumint(8) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`num`)
);

OPEN cur1;

SET offset = elimit + slimit;
FETCH cur1 INTO id_now, pid_now;

WHILE seek_end = FALSE AND i < offset DO
IF i >= slimit THEN
INSERT INTO `temp_table` (id, parent) VALUES (id_now, pid_now);
INSERT INTO `temp_table` (id, parent) (SELECT id, parent FROM `table1`
WHERE parent = id_now ORDER BY id DESC LIMIT 0, 4) ORDER BY id ASC;
END IF;
FETCH cur1 INTO id_now, pid_now;

SET i = i + 1;
END WHILE;
CLOSE cur1;

SELECT * FROM temp_table;
DROP TABLE IF EXISTS temp_table;
END;
$$

DELIMITER ;



вызов:
CALL get_table(0, 20);


[Это сообщение - спам!]

Последние сообщения из форума

Уважаемые посетители форума MySQL.RU!
Убедительная просьба, прежде чем задавать свой вопрос в этом форуме, обратите внимание на разделы:
- ответы на наиболее часто задаваемые вопросы - FAQ
- раздел документация
- раздел поиск по сообщениям форума и документации
Также, старайтесь наиболее подробно указывать свою ситуацию (версию операционной системы, версию MySQL, версию программного обеспечения, по которому возникает вопрос, текст возникающих ошибок, и др.)
Помните, чем конкретнее Вы опишете ситуацию, тем больше шансов получить реальную помощь.
 Имя:
 E-mail:
 Тема:
 Текст:
Код подтверждения отправки: Code
40605



РЕКЛАМА НА САЙТЕ
  Создание сайтов | |