|
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,
версию программного обеспечения, по которому возникает вопрос, текст возникающих ошибок, и др.)
Помните, чем конкретнее Вы опишете ситуацию, тем больше шансов получить реальную помощь.
40605
|
|