|
|
|
|
|
для: cheops
(04.04.2012 в 20:46)
| | Кажется, сообразил примерно во такой запрос надо:
SELECT point FROM points
WHERE NOT EXISTS
(
SELECT point WHERE
getParentsAndSelf(point, knee) IN(Список родителей жениха,включая самого жениха)
)
|
Только надо переделать getParentsAndSelf() так, чтобы она возвращала одну колонку родственников.
Если синтаксис вызова процедуры правильный, то, думаю - зто мне и нужно.
Взгляните, пожалуйста, на предмет: правильно ли я вызываю процедуру?
Как их вообще вставляют в запросы? | |
|
|
|
|
|
|
|
для: cheops
(04.04.2012 в 20:46)
| |
СALL getParentsAndSelf(id, maxKnee);
|
Возвращает 4 колонки
1 первичный ключ
2 id
3 parent
4 колено - ну, не совсем колено, но на какой ступени пра пра пра находится родственник .(0) - для id=parent
Можно вроде бы пересечь выборки, и отсортировать по минимуму суммы колен общих родственников, но что-то не могу это ясно представить в виде запроса. | |
|
|
|
|
|
|
|
для: cheops
(04.04.2012 в 20:46)
| | >Кстати, возможно вам будет интересно почитать и MySQL на примерах, там много, того, что нет в MySQL 5 (писали позже по уже более свежей версии).
Да, интересно было бы посмотреть на примеры с курсорами итд.
Но данная тема осталась незакрытой.
Я написал рекурсивную процедуру собирающую всех предков до 7-го колена в простую таблицу.
Действительно, рекурсивные вызовы можно осуществлять!
Но это меньшая часть проблемы: можно было и без рекурсии написать, хотя так код более длинный вышел бы, и, соответственно, дебажить дольше.
Как теперь сделать выборку невесты у которой нет родственников входящих в этот список.
Или выборку с сортировкой по длине родственной связи. | |
|
|
|
|
|
|
|
для: Eugene77
(04.04.2012 в 16:23)
| | Кстати, возможно вам будет интересно почитать и MySQL на примерах, там много, того, что нет в MySQL 5 (писали позже по уже более свежей версии). | |
|
|
|
|
|
|
|
для: cheops
(04.04.2012 в 15:54)
| | А вот это уже интересно!
Я такого не читал. У меня книга называется просто (MySQL 5).
Спасибо! Буду разбираться | |
|
|
|
|
|
|
|
для: Eugene77
(04.04.2012 в 15:46)
| | Книг у нас много, вот в "MySQL: на примерах" я вижу целый подраздел им посвящен, я не очень понимаю, что вызывает сложность, просто вместо хранимый функции (там действительно есть ограничения) создайте хранимую процедуру - их точно можно делать рекурсивными, передавая нужные значения через параметры. Вот допустим рекурсивная процедура удаления каталога (для упрощения без удаления товарных позиций)
CREATE PROCEDURE delcat (IN id INT)
BEGIN
DECLARE is_end INT DEFAULT 0;
DECLARE id_cat INT DEFAULT 0;
DECLARE cat CURSOR FOR
SELECT id_catalog FROM catalogs WHERE id_parent = id;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET is_end = 1;
OPEN cat;
wet : LOOP
FETCH cat INTO id_cat;
IF id_cat > 0 THEN CALL delcat(id_cat);
END IF;
DELETE FROM catalogs WHERE id_catalog = id_cat;
IF is_end THEN LEAVE wet;
END IF;
END LOOP wet;
CLOSE cat;
DELETE FROM catalogs WHERE id_catalog = id;
END
//
|
| |
|
|
|
|
|
|
|
для: cheops
(04.04.2012 в 12:39)
| | Благодарю за столь подробный ответ!
Но он не на мой вопрос.
Про процедуры я в вашей книге давно прочитал, но там нет ни одного примера рекурсивного вызова процедуры поэтому я просто не понимаю этого словосочетания.
РЕКУРСИВНЫЕ ПРОЦЕДУРЫ - что подразумевается - ну хоть простейший примерчик! | |
|
|
|
|
|
|
|
для: Eugene77
(04.04.2012 в 08:15)
| | Зависит от книги, но вроде везде старались упоминать. В MySQL два вида (внешне больше, но по внутренней сути два) организации кода:
CREATE FUNCTION - хранимая функция (вызывается как обычная функция)
CREATE PROCEDURE - хранимая процедура (вызывается ключевым словом CALL)
Функция возвращает значение, как традиционная C-функция, в C-подобных языках нет конструкции "процедура", однако, она есть в SQL, более того, много лет назад, когда я знакомился с диалектом SQL в MySQL я дивился, что у них оказывается еще и хранимые функции есть, странно, вроде по стандарту должны быть только процедуры, но стандарты SQL мало где реализованы точно, поэтому заморачиваться не стал. Ситуация мне была знакома, процедуры я знал по Fortran, а функции по C. Если, для вас это в новинку, пожалуйста, обратите внимания, это разные конструкции одного и того же. У них свои собственные заморочки. Функции они вроде как удобнее, особенно для программистов, знакомых с C-подобным языком, но вообще по стандарту SQL положены процедуры - поэтому любая уважающая себя СУБД их реализует. | |
|
|
|
|
|
|
|
для: cheops
(03.04.2012 в 20:51)
| | >Функции может быть (что-то да, там такое было), процедуры точно должны поддерживать рекурсивный вызов...
А смысл какой?
Если нельзя через возвращаемый аргумент передать то, что насобирали потомки,
то всё надо ссыпать в одну кучку (табличку) - это и без рекурсивного вызова ...
Вообще, что такое рекурсивный вызов процедуры?
В книге вы об этом не писали.
Рекурсивные функции - это общеизвестно, а вот процедуры... да ещё рекурсивные... я просто теряюсь...
Давно-давно когда-то встречал бейсик с процедурами, но тогда у меня ещё соска изо рта выпала и я отвлёкся не успев разобраться что к чему : ) | |
|
|
|
|
|
|
|
для: Eugene77
(03.04.2012 в 13:55)
| | Функции может быть (что-то да, там такое было), процедуры точно должны поддерживать рекурсивный вызов... | |
|
|
|
|