|
|
|
запрос теоретически возможен?
|
|||
|---|---|---|---|
|
#18+
Добрый день всем, кому еще не надоело отвечать на глупые вопросы :0)) и тем, кому надоело - тоже добрый день! Имеется многоуровневая партнерка. В БД структура сохранена нормально - у каждого юзера есть "вышестоящий". Возможно ли составить такой запрос, чтобы одним запросом можно было получить всю структуру юзера на всю глубину или хотя бы на заданное количество уровней , например на 7? Я могу сделать с помощью рекурсивной функции на РНР, но запросов получается много (даже слишком :0(( ), а вот хотелось бы одним запросом... или это из области фантастики? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2012, 00:54:39 |
|
||
|
запрос теоретически возможен?
|
|||
|---|---|---|---|
|
#18+
нужен фак! (пардон май френч). Товарищи специалисты, напишите фак, плиз! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2012, 01:38:19 |
|
||
|
запрос теоретически возможен?
|
|||
|---|---|---|---|
|
#18+
trew, модераторам или автору bochkov: плиз, добавьте в тот топик (что по ссылке) решение на переменных с одним parent_id !!! Или ссылку туда на весь топик "массивы в ..."!!! Ну оговорите его, что "не для слабонервных"... но красиво же как! потеряется же... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2012, 12:00:48 |
|
||
|
запрос теоретически возможен?
|
|||
|---|---|---|---|
|
#18+
labirint, древовидную структуру, всеравно надо делать на клиенте. При чем можно обойтись без рекурсии ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2012, 16:02:55 |
|
||
|
запрос теоретически возможен?
|
|||
|---|---|---|---|
|
#18+
Arhat109модераторам или автору bochkov: плиз, добавьте в тот топик (что по ссылке) решение на переменных с одним parent_id !!! Или ссылку туда на весь топик "массивы в ..."!!!Ссылку добавил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2012, 16:28:41 |
|
||
|
запрос теоретически возможен?
|
|||
|---|---|---|---|
|
#18+
artaslabirint, древовидную структуру, всеравно надо делать на клиенте. При чем можно обойтись без рекурсии Перечитал я раз 10 тот ФАК, все равно чайником остался :( artas, а что ты имеешь в виду - "делать структуру на клиенте"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2013, 00:13:08 |
|
||
|
запрос теоретически возможен?
|
|||
|---|---|---|---|
|
#18+
labirint, Тогда задавайте конкретные вопросы по факу... что осталось непонятным. Вполне возможно, что "вам осталось сделать первый шаг". :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2013, 07:06:20 |
|
||
|
запрос теоретически возможен?
|
|||
|---|---|---|---|
|
#18+
Arhat109, ну, прежде, проблема в моих небольших знаниях в мускуле - я не знаю условных обозначений, например ":=" и "@", даже не знаю - куда записать процедуру, приведенную Вами как пример. Обычно я все делаю в РНР скрипте, но это можно прочитать (или догадаться :) ) А вот конкретнее: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 1) как формировать level для таблицы партнерской программы, когда люди в разные места структуры добавляются не систематично? Вообще, для таких условия построения структуры - подходит ли эта процедура? 2) как в запросе задать глубину требуемой части дерева? 3) возможно ли таким подходом делать подсчеты? 4) возможно ли это использовать для INSERT по определенным правилам? Спасибо за внимание! (к нашим проблемам) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2013, 10:07:35 |
|
||
|
запрос теоретически возможен?
|
|||
|---|---|---|---|
|
#18+
labirint, это можно считать в проце-дурой, но в том виде как есть - это просто набор запросов к Мускулю, каждый из который завершается ; и они подаются последовательно в одной сессии "подряд": 1. SET @C=...; -- устанавливаем переменную сессии с именем "С" в это значение. @ -- признак сессионной переменной и только. Тут - просто такой комментарий. И только. В целом - не нужно. 2. SELECT ... ; -- запрос. Просто он хитрый и поэтому отформатирован в несколько строк, чтобы было понятней "чего в нём спрашивается" у Мускуля. И только. 3. строка с # -- тоже комментарий. Только с того места, где оно стоит и до конца строки. Ничего больше. Внутри запроса также используются переменные сессии, но в запросе значения им присваиваются через := и только. Что делает запрос? В секции FOM - указано объединение подзапроса с ником 'dummy' и таблички с именем tree. Как видно, подзапрос тупо присваивает сессионным переменным начальные значения... и всё. Там, в качестве начального значения указано search_num -- типа параметр процедуры... при одиночном запросе, можно просто прописать требуемую константу - идентификатор, как стартовый узел поиска поддерева. Фсё. Ничего больше в секции from - нету. Разве что "прибит гвоздиком" (force index(primary key) первичный ключ как пожелание, сканировать записи строго в его последовательности. В секции Веры сказано "копать до тех пор, пока очередной родитель ещё присутствует в переменной @array". Фсё, тожа. В секции select указано, что для каждой найденной записи (родитель которой есть в @array, а изначально там исходный узел из подзапроса установки переменных!) отдай как поля: 1. Уровень записи 2. Текущего родителя, а заодно: если предыдущий родитель был другим, то 2.1. удали его из переменной @array 2.2. , запомни текущего на будущее 3. Собственно идент узла (как дитенка), а заодно: если текущий родитель есть в списке, то: 3.1. добавь меня в список возможных родителей (а вдруг у меня есть потомки! -- вот тут-то и создается список проверяемых узлов, связанных с первым, "внезапно" :) Всё. Ничего больше отдавать не требуется. Как видим, исходная таблица - тупо сканируется в порядке первичного ключа, который составной от верхнего уровня к листьям и с меньшего родителя к большему. Если кроме первичного, у таблички других ключей нет, то и ладушки. Работать будет. А вот ежели есть, то не факт: мускуль запросто может "опимизнуть" по другому индексу и порядок сканирования будет нарушен.. со всеми последствиями. Об чём в факе и было указано как существенное ограничение решения, дополнительно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2013, 11:39:34 |
|
||
|
запрос теоретически возможен?
|
|||
|---|---|---|---|
|
#18+
labirint, теперь на вопросы внизу поста (а то и так много): 1. level - это тупо номер уровня, +1 к корню на каждом уровне. Поскольку добавляя запись в табличку, вы всегда её привязываете к некоторому узлу, то по факту - уровень новой записи - это уровень родителя+1. 2. Добавить соответствующее условие в часть Веры: И "уровень не больше заданного" как-то так. 3. ?!? а почему нет? Результат - список узлов данного поддерева от заданного узла... а куда и с чем вы его считать будете... пробуйте. Все равно в надзапрос заворачивать... 4. insert .. select() ? почему нет? я - не пгобовал за ненадобностью... но при переносе поддеревьев, возможно и актуально. Дерзайте. ИМХО есть в факе: запрос оригинальный, работает быстро... но имеет существенные недостатки (отсутствие гарантии выборки строго по индексу)... то есть для очень простых и/или лабораторных испытаний - полезно. А для "боевого применения", я бы выбрал запрос с подселектом. Он значительно медленнее, но зато не страдает фигней. ... хотя, для простых поисков поддеревьев он у меня работает в таком виде... и давно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2013, 11:51:14 |
|
||
|
запрос теоретически возможен?
|
|||
|---|---|---|---|
|
#18+
Arhat109labirint, это можно считать в проце-дурой, но в том виде как есть - это просто набор запросов к Мускулю, каждый из который завершается ; и они подаются последовательно в одной сессии "подряд": Большое спасибо - вся ясно! Только еще вопросы :) 1) в моем случае эту таблицу действительно можно сделать с таким одним составным индексом. А есть предположения или, еще лучше, знания - как подобный запрос поведет себя с JOIN на другие таблицы? 2) есть ли в MySQL возможность какой-либо командой временно "отключать" индекс, подобно как FORCE INDEX, только наоборот :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2013, 16:23:23 |
|
||
|
запрос теоретически возможен?
|
|||
|---|---|---|---|
|
#18+
Arhat109labirint, ИМХО есть в факе: запрос оригинальный, работает быстро... но имеет существенные недостатки (отсутствие гарантии выборки строго по индексу)... то есть для очень простых и/или лабораторных испытаний - полезно. А для "боевого применения", я бы выбрал запрос с подселектом. Он значительно медленнее, но зато не страдает фигней. А этот - с подселектом - какой из показанных в ФАКе? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2013, 17:06:26 |
|
||
|
запрос теоретически возможен?
|
|||
|---|---|---|---|
|
#18+
Arhat109, попробовал я сделать составной первичный ключ и получил от мускула "желтую карточку" : #1075 - Incorrect table definition; there can be only one auto column and it must be defined as a key правда делал я это не при создании, а ALTER TABLE, может в этом причина? Сейчас попробую создать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2013, 22:42:11 |
|
||
|
запрос теоретически возможен?
|
|||
|---|---|---|---|
|
#18+
Arhat109, не дает создать таблицу с таким индексом :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2013, 22:49:59 |
|
||
|
запрос теоретически возможен?
|
|||
|---|---|---|---|
|
#18+
labirintArhat109, не дает создать таблицу с таким индексом :( создал я таблицу с одинарным primery key ('id') и начал пробовать заполнить ее как у Вас сделано. Тоже не получается :( Мускул ругается на все подряд. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2013, 23:54:55 |
|
||
|
запрос теоретически возможен?
|
|||
|---|---|---|---|
|
#18+
labirint, Работа с переменными -- дело непростое. И не то что сложно для понимания, а то что сама база под этим делом неустойчивая С нуля вы потеряете больше времени чем получите результат. Алтернатива -- сделайте на кленте. Если надо найти дерево одного конкретного родителя, то ну 10, ну 15 поколений -- запросы по индексу дают пару милисекунд, ну 50 милисекунд потратите на это дело в медленый день. За что боретесь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2013, 04:04:36 |
|
||
|
запрос теоретически возможен?
|
|||
|---|---|---|---|
|
#18+
labirint, упс... только сейчас увидел. Сразу на всё: 1. 1) в моем случае эту таблицу действительно можно сделать с таким одним составным индексом. А есть предположения или, еще лучше, знания - как подобный запрос поведет себя с JOIN на другие таблицы? 2) есть ли в MySQL возможность какой-либо командой временно "отключать" индекс, подобно как FORCE INDEX, только наоборот :) При создании первичного и единственного составного индекса, автоинкремент там надо отключать. Практика показала, что инкрементировать можно на клиенте кучей разных способов, начиная от ведения таблицы универсального идента... типа uid. ... уже столкнулись. Нормально ведет, например так: SELECT destination.* FROM your_table AS destination JOIN( # втыкаем сюда это чудо как подзапрос ) AS derived ON derived.child_id = destination.ident # Where, group by и т.д. дальше по вкусу... 2. Я такой не знаю. Больше того, и форсеиндекс - тоже всего лишь рекомендация... он не всегда прибивает индекс к запросу... 3. "с подселектом" -- там, где-то чуть выше, который определен как запрос Бочкова. Он практически такой же, но на каждом элементе делает подчиненный запрос к таблице для поиска всех потомков, что гарантирует их корректный выбор. Но это значительно дольше. 4. Этот вариант запроса - быстр и корректен, только при наличии составного индекса и его использовании. За всё надо платить. Снесите автоинкрементный индекс и признак автоинкремента и создайте составной индекс в заданном порядке полей, именно так (level, parent_id, id)... и попробуйте на тестовой табличке... потом попробуйте Бочковский вариант и оцените разницу в скорости... если она вас устраивает - предпочтите бочковский вариант. Он существенно устойчивее. И, только если вам нужна бОльшая скорость реакции - вот тогда, продолжайте экспериментировать дальше с этим вариантом. Особое внимание - на корректность использования индекса (без него может стать неверно, если в таблице записи вставляются не по порядки и/или удаляются со временем). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2013, 07:05:57 |
|
||
|
запрос теоретически возможен?
|
|||
|---|---|---|---|
|
#18+
labirint, Просмотрел фак ещё раз. Вот тут 13674855 есть же мой вывод о целесообразности деревьев на одном поле parent_id... в конце поста. Перечитайте, сделайте отдельную табличку всех ребер и не мучайтесь. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2013, 07:19:42 |
|
||
|
запрос теоретически возможен?
|
|||
|---|---|---|---|
|
#18+
javajdbc, спасибо за участие в обсуждении! javajdbclabirint, Работа с переменными -- дело непростое.... сама база под этим делом неустойчивая Алтернатива -- сделайте на кленте. Как? Что это подразумевает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2013, 09:09:43 |
|
||
|
запрос теоретически возможен?
|
|||
|---|---|---|---|
|
#18+
Arhat109labirint, Просмотрел фак ещё раз. Вот тут 13674855 есть же мой вывод о целесообразности деревьев на одном поле parent_id... в конце поста. Перечитайте, сделайте отдельную табличку всех ребер и не мучайтесь. :) ОК. ФАК перечитываю, если б он был на бумаге - уже до дыр бы зачитал, но "я не чайник - я только учусь"... Можно (не)много подробнее про таблицу всех ребер? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2013, 09:13:15 |
|
||
|
запрос теоретически возможен?
|
|||
|---|---|---|---|
|
#18+
labirint, обыкновенная таблица связи узла с узлом: "родитель" - "потомок" - "порядок"(если надо) - "уровень"(если надо). Всё. Каждый новый потомок добавляется ко всем своим родителям сразу (добавляем все ребра к этому потомку для всех уровней дерева) , что позволяет простым условием "где родитель равен заданному" вытащить всех его потомков и даже рассортировать по уровням и/или по порядку, если дерево - ориентированно. Позволяет поддерживать практически любые графы, а не только деревья. В общем случае, размер таблицы растет как факториал от числа узлов, но для деревьев, особенно сильно ветвистых (много потомков) и не сильно глубоких (мало подуровней) - может оказаться также компактно как и поля "уровень" и "родитель" в основной таблице (уровень, порядок узла - полезны сами по себе и для других задач). ... а главное, если снабдить родителя и потомка доп. данными о сущностях - можно организовывать в деревья произвольные данные из разных таблиц/сущностей... :) Как пример: узел 1 - корень. Добавляем к нему потомков 2,3: появляются записи 1-2 и 1-3. Добавляем к узлу 2 потомков 4,5 (третий уровень поддерева): появляются записи: 1-4, 2-4 и 1-5, 2-5 Добавляем записи к узлу 5 (узлы 10,12,15): появляются записи 1-10,1-12,1-15 и 2-10, 2-12, 2-15 и 5-10, 5-12, 5-15. ... то есть добавляем новый узел ко всем родительским вершинам заданного узла (select где заданный = потомку). можно ваще оформить как отдельную таблицу с классом доступа на клиенте или ХП и гонять деревья независимо от их участников (собственно у себя так и сделал года 2 назад). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2013, 10:46:30 |
|
||
|
запрос теоретически возможен?
|
|||
|---|---|---|---|
|
#18+
labirint, странно вы его перечитываете. Вот же 13969570 практически полный пример внутренней части процедуры тестирования, которой всё это гонял когда-то. Там и создание таблички, и её наполнение (есть даже вариант псевдослучайного построения деревьев за комментом)... есть и все тестируемые запросы... "Пгобовали"? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2013, 10:54:10 |
|
||
|
запрос теоретически возможен?
|
|||
|---|---|---|---|
|
#18+
Arhat109labirint, странно вы его перечитываете. Вот же 13969570 практически полный пример внутренней части процедуры тестирования, которой всё это гонял когда-то. Там и создание таблички, и её наполнение (есть даже вариант псевдослучайного построения деревьев за комментом)... есть и все тестируемые запросы... "Пгобовали"? :) Ну, так именно этот пример я и пробовал. Ничего не получилось :( При попытке заполнения таблицы Мускуль ругается на каждую строку ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2013, 11:24:38 |
|
||
|
запрос теоретически возможен?
|
|||
|---|---|---|---|
|
#18+
Arhat109, да, по поводу " таблица связи узла с узлом: "родитель" - "потомок" " со всеми вышестоящими - дело нешуточное. Если в структуре уровней 200-250..... Хотя для моего случая - допустимо, у меня примерно до 12 уровней дойдет. Чтобы закрепить понимание: для узла на 10-м уровне в таблицу ребер добавляется 9 строк? Начиная с 1-го узла . Правильно? А чтобы получить для него все верхние узлы, делаем запрос по родителям для непосредственного родителя? И прибавляем этого сАмого родителя. Да? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2013, 11:34:12 |
|
||
|
запрос теоретически возможен?
|
|||
|---|---|---|---|
|
#18+
labirint, ну типа того. Зато, выборка "отдай мне всех деток от заданного" - одним движением 6-го пальца левой-задней ноги. Аналогично "отдай мне всех предков заданного" = "дай мне тех, где я - потомок", а кроме этого, нет ограничений на количество предков (один потомок может быть деткой нескольких родителей!) Для каждого добавляемого узла надо делать предварительную выборку всех предков того узла, к которому он добавляется и добавлять на каждого предка тоже по записи... то есть количество вставляемых записей для узла 10-го уровня = 10 (тот, к которому добавляем и 9 его предков, если их по одному на узел - то есть "дерево"). ... делается легко через "insert ... (select дай предков заданного) union (заданный)". Кстати, этот запрос будет корректно добавлять потомка и в случае нескольких родителей (собственно ему пофиг сколько их там)... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2013, 14:29:42 |
|
||
|
запрос теоретически возможен?
|
|||
|---|---|---|---|
|
#18+
labirint, почему-то у меня даже такое "выражение" (для пробы) Код: sql 1. 2. 3. 4. 5. 6. 7. 8. вызывает ошибку. Мускул пишет Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2013, 17:03:36 |
|
||
|
запрос теоретически возможен?
|
|||
|---|---|---|---|
|
#18+
REPEAT может употребляться внутри функций/процедур/триггеров. А в приведенном коде ничего этого не видно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2013, 17:06:55 |
|
||
|
запрос теоретически возможен?
|
|||
|---|---|---|---|
|
#18+
miksoftREPEAT может употребляться внутри функций/процедур/триггеров. А в приведенном коде ничего этого не видно. спасибо! а как в phpMyAdmin на вкладке SQL написать процедуру/функцию/триггер? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2013, 17:39:34 |
|
||
|
запрос теоретически возможен?
|
|||
|---|---|---|---|
|
#18+
miksoft, :) потому что русским язуком писано "это внутренняя часть проце-дуры"... :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2013, 17:53:41 |
|
||
|
запрос теоретически возможен?
|
|||
|---|---|---|---|
|
#18+
Arhat109, ну, а мне скажите - как это сделать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2013, 18:40:53 |
|
||
|
запрос теоретически возможен?
|
|||
|---|---|---|---|
|
#18+
labirint, пишу: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. ошибка: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. помогите пожалуйста! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2013, 18:51:04 |
|
||
|
запрос теоретически возможен?
|
|||
|---|---|---|---|
|
#18+
labirint, а теперь про DELIMITER забыли. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2013, 19:59:59 |
|
||
|
запрос теоретически возможен?
|
|||
|---|---|---|---|
|
#18+
miksoft, спасибо, но я о нем даже и не знаю. Куда ставить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2013, 20:43:29 |
|
||
|
запрос теоретически возможен?
|
|||
|---|---|---|---|
|
#18+
miksoftlabirint, а теперь про DELIMITER забыли. Поставил delimiter - сработало! Ура!!!!!!! Спасибо!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2013, 20:50:02 |
|
||
|
запрос теоретически возможен?
|
|||
|---|---|---|---|
|
#18+
labirint, гм... оказалосб, что я допустил ошибку в коде процедуры. Как ее теперь исправить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2013, 20:59:35 |
|
||
|
запрос теоретически возможен?
|
|||
|---|---|---|---|
|
#18+
labirintlabirint, гм... оказалосб, что я допустил ошибку в коде процедуры. Как ее теперь исправить? Все нашел. Спасибо! ... продолжение следует :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2013, 21:16:50 |
|
||
|
запрос теоретически возможен?
|
|||
|---|---|---|---|
|
#18+
что-то я туплю :( Arhat109labirint, ... делается легко через "insert ... (select дай предков заданного) union (заданный)". не пойму - как это составить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2013, 00:44:33 |
|
||
|
запрос теоретически возможен?
|
|||
|---|---|---|---|
|
#18+
labirint, :) примерно так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Внешним селектом, насколько понимаю, можно не обрамлять. Привел для наглядности, ну и может Вам к юниону ещё чего объединить захочется... Вместо переменных можно подставлять сразу константные значения, если запрос формируется на клиенте и константы известны... или брать их откуда надо подселектами... короче, дерзайте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2013, 07:24:08 |
|
||
|
запрос теоретически возможен?
|
|||
|---|---|---|---|
|
#18+
Arhat109, если разрешается несколько родителей (ребра для НЕ деревьев!), то неплохо делать INSERT IGNORE... или ON DUPLICATE KEY UPDATE... и соответственно составной уникальный ключ на оба поля... тогда при попытке создать уже существующее ребро графа - оно будет или игнорироваться или вызывать соответствующие вашей задумке update. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2013, 07:29:02 |
|
||
|
запрос теоретически возможен?
|
|||
|---|---|---|---|
|
#18+
Arhat109, огромная спасиба! Кое-что уже получается :) правильно ли я понял, что в строке Код: sql 1. вместо @dest_node тоже нужно делать подзапрос? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2013, 13:57:38 |
|
||
|
запрос теоретически возможен?
|
|||
|---|---|---|---|
|
#18+
labirint, :) зачем? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2013, 14:54:03 |
|
||
|
запрос теоретически возможен?
|
|||
|---|---|---|---|
|
#18+
labirint, да..., написал так (где '$lid' - это mysql_insert_id(); после записи в основную таблицу): Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. а Мускул не хочет добавлять несколько записей, еще и замечание делает :), мол подзапрос возвращает больше 1-й строки... А как же в таком случае записать все ребра? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2013, 15:02:49 |
|
||
|
запрос теоретически возможен?
|
|||
|---|---|---|---|
|
#18+
labirint, :) не нужен там "подзапрос". Перечитайте ещё раз внимательно мой пост с этим примером... и тренируйтесь. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2013, 19:11:06 |
|
||
|
запрос теоретически возможен?
|
|||
|---|---|---|---|
|
#18+
Arhat109labirint, :) не нужен там "подзапрос". Перечитайте ещё раз внимательно мой пост с этим примером... и тренируйтесь. :) ХМ... попробовал снова, действительно - не нужен, добавляет все ребра, а до этого точно такой же запрос добавлял только 2 записи: последнюю и предпоследнюю ну, да ладно, теперь работает - и Слава Богу! Arhat109, Вы мне очень помогли - огромное спасибо! Но это еще не все :) и если Вам не наскучило, прошу подсказать - куда думать дальше? это дерево - партнерская программа. Узел приглашает в структуру другие узлы - любое количество, но под ним могут записаться только 5 чел, остальные пишутся на уровень ниже - его детям: сначала 1-му - все 5, затем - 2-му и т.д. На текущей стадии еще можно поменять систему, например: сначала всем пятерым - 1-е дитя, потом всем - 2-е и т.д., если не получится по предыдущему варианту... или просто по 1 шт. - каждому "всем сестрам - по серьгам". Важно, чтобы запрос распознавал, что у дитяти еще не все запослнено и заполнял, учитывая, что эти дети также могут подписывать под себя новых и под своих детей по тем же правилам. Как заполнился уровень из этих пяти, а тот же родитель все зазывает и зазывает, следующие пишутся в 3-й уровень - его внукам и т.д. Хочется построить один запрос для такого способа построения структуры или, если не один, то хотя бы ограниченное число запросов. При этом есть еще небольшая вариация: когда у родителя заполняется 3-й уровень, т.е. 125 правнуков - он имеет право записать себе в 1-й уровень - 6-го ребенка и строить ему все уровни, как и предыдущим. Заполнил 5 уровней - пишет себе 7-го и ему строит структуру и т.д. - максимум - 9. Что скажете? Не бросите меня на произвол судьбы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2013, 00:20:48 |
|
||
|
запрос теоретически возможен?
|
|||
|---|---|---|---|
|
#18+
labirint, :) брошу. Уж не обижайтесь. Но, а) мало чего понял в вашем описании (а глыбоко вникать - нет большого желания, своих задач хватает) б) вы уж оперделитесь: или только по 5 потомком или 6, 7 и так далее. А то, противоречивое условие (уже в этой части)... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2013, 16:09:59 |
|
||
|
запрос теоретически возможен?
|
|||
|---|---|---|---|
|
#18+
Arhat109labirint, :) брошу. Уж не обижайтесь. Но, это грустно... ну, ладно, Вы и так очень мне помогли, спасибо! Arhat109labirint, а) мало чего понял в вашем описании (а глыбоко вникать - нет большого желания, своих задач хватает) б) вы уж оперделитесь: или только по 5 потомком или 6, 7 и так далее. А то, противоречивое условие (уже в этой части)... Да, в общем-то б о льшая часть из этого уже получается, если будут затыки - спрошу конкретно. Успеха Вам! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2013, 16:26:13 |
|
||
|
запрос теоретически возможен?
|
|||
|---|---|---|---|
|
#18+
trewlabirint, Древовидные структуры средствами MySQL читать Заметьте, мы сразу, при создании таблицы товаров, задаем связь между полем CatID таблицы товаров (Goods) и полем ID таблицы разделов (Catalog). Автор принял желаемое за действительное. Связь он, видите-ли, сразу задал, прямо в таблице, не отходя от кассы. Тогда зачем запрос вида SELECT g.* FROM Goods g WHERE CatID = 1; Такие факи только еще больше запутают читателя. Наиболее известные деревянные модели: nested set closure table materialized path Насколько я понял из обсуждения предлагалось второе. Так вот, уловка в том, что деревом может быть не вся база, а какая-то диспетчерская таблица. Все остальные в классической adjacency list model ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2013, 22:22:01 |
|
||
|
запрос теоретически возможен?
|
|||
|---|---|---|---|
|
#18+
Надо бы уточнить. Это не связь он задал, автор фака, а выдал инструкцию приводу БД на сохранение целостности данных. Если выбранный привод (engine) кладет на такие инструкции (например как MyISAM) - приложение написанное с учетом подразумеваемых ограничений привода порушит все что сможет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2013, 22:27:44 |
|
||
|
запрос теоретически возможен?
|
|||
|---|---|---|---|
|
#18+
deblogger, 1. Все-таки замечу что в факе, написно верно. И пример показан на связке id - parent_id, вполне корректный даже для MyIsam. Кстати, конкретно это ограничение там "в общем-то" и не нужно. Дерево создано на одной таблице... а уж с чем и зачем оно связано ключами - к сути примера не имеет никакого отношения. Из предложенных вами: nested set -- самый трудозатратный, объемный и медленный практически для любых случаев. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2013, 06:53:33 |
|
||
|
запрос теоретически возможен?
|
|||
|---|---|---|---|
|
#18+
Arhat109, Привет, всем! зашел сюда нечаянно, почти год прошел. Все получилось, работает корректно. За ФАК и консультации спасибо! Оценить скорость и практичность решения пока не получается - проект малопосещаемый :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2014, 23:54:09 |
|
||
|
|

start [/forum/topic.php?all=1&fid=47&tid=1834649]: |
0ms |
get settings: |
6ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
48ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
61ms |
get tp. blocked users: |
1ms |
| others: | 205ms |
| total: | 348ms |

| 0 / 0 |
