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

Форум MySQL

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

 

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

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: Подбор невесты

Сообщения:  [1-10]    [11-20]  [21-22] 

 
 автор: Eugene77   (05.04.2012 в 18:23)   письмо автору
 
   для: cheops   (04.04.2012 в 20:46)
 

Кажется, сообразил примерно во такой запрос надо:

SELECT point FROM points
WHERE NOT EXISTS 
      (
      SELECT point WHERE 
      getParentsAndSelf(point, knee)   IN(Список родителей жениха,включая самого жениха)
      )


Только надо переделать getParentsAndSelf() так, чтобы она возвращала одну колонку родственников.

Если синтаксис вызова процедуры правильный, то, думаю - зто мне и нужно.

Взгляните, пожалуйста, на предмет: правильно ли я вызываю процедуру?
Как их вообще вставляют в запросы?

  Ответить  
 
 автор: Eugene77   (05.04.2012 в 16:56)   письмо автору
 
   для: cheops   (04.04.2012 в 20:46)
 

СALL getParentsAndSelf(id, maxKnee);

Возвращает 4 колонки
1 первичный ключ
2 id
3 parent
4 колено - ну, не совсем колено, но на какой ступени пра пра пра находится родственник .(0) - для id=parent

Можно вроде бы пересечь выборки, и отсортировать по минимуму суммы колен общих родственников, но что-то не могу это ясно представить в виде запроса.

  Ответить  
 
 автор: Eugene77   (05.04.2012 в 16:22)   письмо автору
 
   для: cheops   (04.04.2012 в 20:46)
 

>Кстати, возможно вам будет интересно почитать и MySQL на примерах, там много, того, что нет в MySQL 5 (писали позже по уже более свежей версии).

Да, интересно было бы посмотреть на примеры с курсорами итд.

Но данная тема осталась незакрытой.

Я написал рекурсивную процедуру собирающую всех предков до 7-го колена в простую таблицу.
Действительно, рекурсивные вызовы можно осуществлять!

Но это меньшая часть проблемы: можно было и без рекурсии написать, хотя так код более длинный вышел бы, и, соответственно, дебажить дольше.

Как теперь сделать выборку невесты у которой нет родственников входящих в этот список.

Или выборку с сортировкой по длине родственной связи.

  Ответить  
 
 автор: cheops   (04.04.2012 в 20:46)   письмо автору
 
   для: Eugene77   (04.04.2012 в 16:23)
 

Кстати, возможно вам будет интересно почитать и MySQL на примерах, там много, того, что нет в MySQL 5 (писали позже по уже более свежей версии).

  Ответить  
 
 автор: Eugene77   (04.04.2012 в 16:23)   письмо автору
 
   для: cheops   (04.04.2012 в 15:54)
 

А вот это уже интересно!
Я такого не читал. У меня книга называется просто (MySQL 5).
Спасибо! Буду разбираться

  Ответить  
 
 автор: cheops   (04.04.2012 в 15:54)   письмо автору
 
   для: 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
//

  Ответить  
 
 автор: Eugene77   (04.04.2012 в 15:46)   письмо автору
 
   для: cheops   (04.04.2012 в 12:39)
 

Благодарю за столь подробный ответ!
Но он не на мой вопрос.
Про процедуры я в вашей книге давно прочитал, но там нет ни одного примера рекурсивного вызова процедуры поэтому я просто не понимаю этого словосочетания.
РЕКУРСИВНЫЕ ПРОЦЕДУРЫ - что подразумевается - ну хоть простейший примерчик!

  Ответить  
 
 автор: 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 положены процедуры - поэтому любая уважающая себя СУБД их реализует.

  Ответить  
 
 автор: Eugene77   (04.04.2012 в 08:15)   письмо автору
 
   для: cheops   (03.04.2012 в 20:51)
 

>Функции может быть (что-то да, там такое было), процедуры точно должны поддерживать рекурсивный вызов...

А смысл какой?
Если нельзя через возвращаемый аргумент передать то, что насобирали потомки,
то всё надо ссыпать в одну кучку (табличку) - это и без рекурсивного вызова ...

Вообще, что такое рекурсивный вызов процедуры?
В книге вы об этом не писали.
Рекурсивные функции - это общеизвестно, а вот процедуры... да ещё рекурсивные... я просто теряюсь...

Давно-давно когда-то встречал бейсик с процедурами, но тогда у меня ещё соска изо рта выпала и я отвлёкся не успев разобраться что к чему : )

  Ответить  
 
 автор: cheops   (03.04.2012 в 20:51)   письмо автору
 
   для: Eugene77   (03.04.2012 в 13:55)
 

Функции может быть (что-то да, там такое было), процедуры точно должны поддерживать рекурсивный вызов...

  Ответить  

Сообщения:  [1-10]    [11-20]  [21-22] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

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