powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / запрос теоретически возможен?
25 сообщений из 51, страница 2 из 3
запрос теоретически возможен?
    #38320556
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
labirint,

ну типа того.

Зато, выборка "отдай мне всех деток от заданного" - одним движением 6-го пальца левой-задней ноги.
Аналогично "отдай мне всех предков заданного" = "дай мне тех, где я - потомок", а кроме этого, нет ограничений на количество предков (один потомок может быть деткой нескольких родителей!)

Для каждого добавляемого узла надо делать предварительную выборку всех предков того узла, к которому он добавляется и добавлять на каждого предка тоже по записи... то есть количество вставляемых записей для узла 10-го уровня = 10 (тот, к которому добавляем и 9 его предков, если их по одному на узел - то есть "дерево").

... делается легко через "insert ... (select дай предков заданного) union (заданный)". Кстати, этот запрос будет корректно добавлять потомка и в случае нескольких родителей (собственно ему пофиг сколько их там)...
...
Рейтинг: 0 / 0
запрос теоретически возможен?
    #38320911
labirint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
labirint,

почему-то у меня даже такое "выражение" (для пробы)

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SET @depth = 3;
SET @maxLevel = 7;

SET @level = 0;
REPEAT
  SET @level = @level+1;
UNTIL @level > @maxLevel END REPEAT;
COMMIT;


вызывает ошибку.
Мускул пишет
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Ошибка
SQL-запрос:

REPEAT SET @level = @level +1;


Ответ MySQL: 

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'REPEAT
  SET @level = @level+1' at line 1 
...
Рейтинг: 0 / 0
запрос теоретически возможен?
    #38320917
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
REPEAT может употребляться внутри функций/процедур/триггеров. А в приведенном коде ничего этого не видно.
...
Рейтинг: 0 / 0
запрос теоретически возможен?
    #38320975
labirint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoftREPEAT может употребляться внутри функций/процедур/триггеров. А в приведенном коде ничего этого не видно.

спасибо!

а как в phpMyAdmin на вкладке SQL написать процедуру/функцию/триггер?
...
Рейтинг: 0 / 0
запрос теоретически возможен?
    #38320994
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft,

:) потому что русским язуком писано "это внутренняя часть проце-дуры"... :)
...
Рейтинг: 0 / 0
запрос теоретически возможен?
    #38321062
labirint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arhat109,

ну, а мне скажите - как это сделать?
...
Рейтинг: 0 / 0
запрос теоретически возможен?
    #38321082
labirint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
labirint,

пишу:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
CREATE PROCEDURE simpleproc ()
BEGIN
SET @depth = 3;
SET @maxLevel = 7;

SET @level = 0;
REPEAT
  SET @d = 1;
  REPEAT
    INSERT INTO `try_us` SET
       `level`     = @level
      , `parid` = @parent:=IF(@level=0, 0, @d + (@level-1) * @depth) 
      , `login`      = CONCAT('login for ',@parent)
    ;
    SET @d = @d + 1;
  UNTIL @d > @depth END REPEAT;
  SET @level = @level + 1;
UNTIL @level > @maxLevel END REPEAT;
COMMIT;
END


ошибка:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
Ошибка
SQL-запрос:

CREATE PROCEDURE simpleproc( ) BEGIN SET @depth =3;


Ответ MySQL: 

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 3 


помогите пожалуйста!
...
Рейтинг: 0 / 0
запрос теоретически возможен?
    #38321138
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
labirint,

а теперь про DELIMITER забыли.
...
Рейтинг: 0 / 0
запрос теоретически возможен?
    #38321174
labirint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,

спасибо, но я о нем даже и не знаю. Куда ставить?
...
Рейтинг: 0 / 0
запрос теоретически возможен?
    #38321179
labirint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoftlabirint,

а теперь про DELIMITER забыли.

Поставил delimiter - сработало! Ура!!!!!!!

Спасибо!!
...
Рейтинг: 0 / 0
запрос теоретически возможен?
    #38321185
labirint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
labirint,

гм... оказалосб, что я допустил ошибку в коде процедуры. Как ее теперь исправить?
...
Рейтинг: 0 / 0
запрос теоретически возможен?
    #38321192
labirint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
labirintlabirint,

гм... оказалосб, что я допустил ошибку в коде процедуры. Как ее теперь исправить?

Все нашел. Спасибо!
... продолжение следует :)
...
Рейтинг: 0 / 0
запрос теоретически возможен?
    #38321302
labirint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
что-то я туплю :(
Arhat109labirint,
... делается легко через "insert ... (select дай предков заданного) union (заданный)".
не пойму - как это составить
...
Рейтинг: 0 / 0
запрос теоретически возможен?
    #38321359
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
labirint,

:) примерно так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SET @new_node = 121; -- номер вставляемого узла.
SET @dest_node = 10;  -- куда вставляем новый узел.

INSERT INTO `tree_table`(`parent_id`, `child_id` /*, `something_else`*/)
SELECT * FROM (
    SELECT t.`parent_id`, @new_node /*, something_else*/
    FROM `tree_table` AS t
    WHERE  t.`child_id` = @dest_node -- отдай всех предков того узла куда буду добавлять новый!
  ) UNION(
    SELECT @dest_node, @new_node /*, something_else */ -- собственно вставка нового дитятки заданному предку.
  )
) AS t2



Внешним селектом, насколько понимаю, можно не обрамлять. Привел для наглядности, ну и может Вам к юниону ещё чего объединить захочется... Вместо переменных можно подставлять сразу константные значения, если запрос формируется на клиенте и константы известны... или брать их откуда надо подселектами... короче, дерзайте.
...
Рейтинг: 0 / 0
запрос теоретически возможен?
    #38321362
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arhat109,

если разрешается несколько родителей (ребра для НЕ деревьев!), то неплохо делать INSERT IGNORE... или ON DUPLICATE KEY UPDATE... и соответственно составной уникальный ключ на оба поля... тогда при попытке создать уже существующее ребро графа - оно будет или игнорироваться или вызывать соответствующие вашей задумке update.
...
Рейтинг: 0 / 0
запрос теоретически возможен?
    #38321882
labirint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arhat109,

огромная спасиба! Кое-что уже получается :)
правильно ли я понял, что в строке
Код: sql
1.
WHERE  t.`child_id` = @dest_node -- отдай всех предков того узла куда буду добавлять новый!


вместо @dest_node тоже нужно делать подзапрос?
...
Рейтинг: 0 / 0
запрос теоретически возможен?
    #38321984
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
labirint,

:) зачем?
...
Рейтинг: 0 / 0
запрос теоретически возможен?
    #38322000
labirint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
labirint,

да...,
написал так (где '$lid' - это mysql_insert_id(); после записи в основную таблицу):
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
INSERT INTO `tree`(`parid`, `chid` , `level`)
SELECT * FROM ( (
    SELECT t.`parid`, '$lid' , t.`level`+1
    FROM `tree` AS t
    WHERE  t.`chid` = (SELECT te.`parid` from `tree` te WHERE te.`chid` = '9')
  ) UNION(
    SELECT '9', '$lid', tr.`level`+1 from tree tr where  tr.`chid` = '9'
  )
) AS t2


а Мускул не хочет добавлять несколько записей, еще и замечание делает :), мол подзапрос возвращает больше 1-й строки...
А как же в таком случае записать все ребра?
...
Рейтинг: 0 / 0
запрос теоретически возможен?
    #38322375
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
labirint,

:) не нужен там "подзапрос". Перечитайте ещё раз внимательно мой пост с этим примером... и тренируйтесь. :)
...
Рейтинг: 0 / 0
запрос теоретически возможен?
    #38322569
labirint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arhat109labirint,

:) не нужен там "подзапрос". Перечитайте ещё раз внимательно мой пост с этим примером... и тренируйтесь. :)

ХМ... попробовал снова, действительно - не нужен, добавляет все ребра, а до этого точно такой же запрос добавлял только 2 записи: последнюю и предпоследнюю
ну, да ладно, теперь работает - и Слава Богу!

Arhat109, Вы мне очень помогли - огромное спасибо!

Но это еще не все :) и если Вам не наскучило, прошу подсказать - куда думать дальше?

это дерево - партнерская программа. Узел приглашает в структуру другие узлы - любое количество, но под ним могут записаться только 5 чел, остальные пишутся на уровень ниже - его детям: сначала 1-му - все 5, затем - 2-му и т.д. На текущей стадии еще можно поменять систему, например: сначала всем пятерым - 1-е дитя, потом всем - 2-е и т.д., если не получится по предыдущему варианту... или просто по 1 шт. - каждому "всем сестрам - по серьгам". Важно, чтобы запрос распознавал, что у дитяти еще не все
запослнено и заполнял, учитывая, что эти дети также могут подписывать под себя новых и под своих детей по тем же правилам. Как заполнился уровень из этих пяти, а тот же родитель все зазывает и зазывает, следующие пишутся в 3-й уровень - его внукам и т.д.
Хочется построить один запрос для такого способа построения структуры или, если не один, то хотя бы ограниченное число запросов.
При этом есть еще небольшая вариация: когда у родителя заполняется 3-й уровень, т.е. 125 правнуков - он имеет право записать себе в 1-й уровень - 6-го ребенка и строить ему все уровни, как и предыдущим. Заполнил 5 уровней - пишет себе 7-го и ему строит структуру и т.д. - максимум - 9.

Что скажете? Не бросите меня на произвол судьбы?
...
Рейтинг: 0 / 0
запрос теоретически возможен?
    #38322787
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
labirint,

:) брошу. Уж не обижайтесь. Но,
а) мало чего понял в вашем описании (а глыбоко вникать - нет большого желания, своих задач хватает)
б) вы уж оперделитесь: или только по 5 потомком или 6, 7 и так далее. А то, противоречивое условие (уже в этой части)...
...
Рейтинг: 0 / 0
запрос теоретически возможен?
    #38322795
labirint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arhat109labirint,

:) брошу. Уж не обижайтесь. Но,
это грустно... ну, ладно, Вы и так очень мне помогли, спасибо!
Arhat109labirint,
а) мало чего понял в вашем описании (а глыбоко вникать - нет большого желания, своих задач хватает)
б) вы уж оперделитесь: или только по 5 потомком или 6, 7 и так далее. А то, противоречивое условие (уже в этой части)...
Да, в общем-то б о льшая часть из этого уже получается, если будут затыки - спрошу конкретно.
Успеха Вам!
...
Рейтинг: 0 / 0
запрос теоретически возможен?
    #38323382
deblogger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
trewlabirint,

Древовидные структуры средствами MySQL читать

Заметьте, мы сразу, при создании таблицы товаров, задаем связь между полем CatID таблицы товаров (Goods) и полем ID таблицы разделов (Catalog).


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

Тогда зачем запрос вида

SELECT g.*
FROM Goods g
WHERE CatID = 1;


Такие факи только еще больше запутают читателя.

Наиболее известные деревянные модели:

nested set
closure table
materialized path

Насколько я понял из обсуждения предлагалось второе. Так вот, уловка в том, что деревом может быть не вся база, а какая-то диспетчерская таблица. Все остальные в классической adjacency list model
...
Рейтинг: 0 / 0
запрос теоретически возможен?
    #38323386
deblogger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо бы уточнить. Это не связь он задал, автор фака, а выдал инструкцию приводу БД на сохранение целостности данных. Если выбранный привод (engine) кладет на такие инструкции (например как MyISAM) - приложение написанное с учетом подразумеваемых ограничений привода порушит все что сможет.
...
Рейтинг: 0 / 0
запрос теоретически возможен?
    #38323576
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
deblogger,

1. Все-таки замечу что в факе, написно верно. И пример показан на связке id - parent_id, вполне корректный даже для MyIsam. Кстати, конкретно это ограничение там "в общем-то" и не нужно. Дерево создано на одной таблице... а уж с чем и зачем оно связано ключами - к сути примера не имеет никакого отношения.

Из предложенных вами: nested set -- самый трудозатратный, объемный и медленный практически для любых случаев.
...
Рейтинг: 0 / 0
25 сообщений из 51, страница 2 из 3
Форумы / MySQL [игнор отключен] [закрыт для гостей] / запрос теоретически возможен?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]