|
|
|
Можно ли решить данную задачу одним SQL запросом?
|
|||
|---|---|---|---|
|
#18+
Добрый день! Немного коряво оформил свой предыдущий топик про HAVING, наверное поэтому там так и не дали ни советов ни ответов. Сформулирую всё здесь по возможности ясно и понятно. Итак есть таблица описывающая элементы. У каждого элемента есть координаты: Строка ( row ) и Столбец ( col ) - это целые числа, а также свойство Длина ( len ) - тоже целое. Т.е. каждый элемент занимает в своей строке клетки начиная с col до col+len. В строках никакие два элемента не пересекаются. Расположены элементы не обязательно вплотную друг к другу. Таблица описывающая эти элементы: Код: sql 1. 2. 3. 4. 5. 6. Так вот задача состоит в том, чтобы сдвинуть данный элемент вправо. Казалось бы в чём проблема? Увеличиваем его col на единицу и дело с концом. Но проблема в том, что элементы не должны пересекаться. Поэтому надо в случае если вплотную к данному элементу справа стоит другой элемент, сдвинуть и его. А если и у того вплотную сосед .... и так далее. Мысль как это решить такая: Надо сдвинуть вправо все элементы для которых выполняются условия: Элемент находится в одной строке с искомым. (a1.row=a2.row) Элемент находится правее искомого (a2.col>a1.col) Сумма длин всех элементов от искомого до данного SUM(aa.len) (все элементы у которых a1.col<=aa.col<=a2.col ) равно разнице ( a2.col + a2.len - a1.col ) Где a1 - это искомый элемент, который надо сдвинуть вправо a2 - элементы которые непрерывно вплотную с искомым a1. Помогите мне решить эту задачу. Вроде звучит просто, а записать это в SQL запросе что-то не удаётся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2016, 17:58 |
|
||
|
Можно ли решить данную задачу одним SQL запросом?
|
|||
|---|---|---|---|
|
#18+
kormot, 1) самое простое передвигать всех сразу. 2) .... и так далее. -> просто используй рекурсию ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2016, 00:14 |
|
||
|
Можно ли решить данную задачу одним SQL запросом?
|
|||
|---|---|---|---|
|
#18+
mini.weblab, очень лаконично. Я не очень понял что предполагается делать. 1. Проще передвинуть всех, это в смысле передвинуть всех что правее неважно вплотную они к этому элементу? Это не решение задачи. 2. Рекурсию, это получается рекурсия процедурой MySQL'ной? В смысле передаём в функцию ID элемента который хотим двинуть, он ищет для него ближайшего правого соседа и если этот сосед вплотную, то вызываем процедуру уже для этого соседа, а если не вплотную, то просто двигаем элемент. Надо посмотреть этот вариант. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2016, 06:16 |
|
||
|
Можно ли решить данную задачу одним SQL запросом?
|
|||
|---|---|---|---|
|
#18+
kormot1. Проще передвинуть всех, это в смысле передвинуть всех что правее неважно вплотную они к этому элементу? Это не решение задачи.Где в условии сказано, что это не решение? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2016, 07:18 |
|
||
|
Можно ли решить данную задачу одним SQL запросом?
|
|||
|---|---|---|---|
|
#18+
tanglir, вы всегда предлагаете решить другую задачу когда не можете решить предложеную? Тоже вариант. Но мне он не подходит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2016, 09:46 |
|
||
|
Можно ли решить данную задачу одним SQL запросом?
|
|||
|---|---|---|---|
|
#18+
kormot, приведите пример набора данных и итоговый набор если у вас есть Коорд row/col то как понимать это - авторТ.е. каждый элемент занимает в своей строке клетки начиная с col до col+len ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2016, 11:11 |
|
||
|
Можно ли решить данную задачу одним SQL запросом?
|
|||
|---|---|---|---|
|
#18+
Alex_Ustinovkormot, приведите пример набора данных и итоговый набор если у вас есть Коорд row/col то как понимать это - авторТ.е. каждый элемент занимает в своей строке клетки начиная с col до col+len Набор данных: Код: sql 1. 2. 3. 4. 5. 6. 7. Так вот из этого набора данных, "вплотную" стоят эл-ты id=1,id=2 также вплотную друг к другу стоят элементы с id=3,id=4,id=5 Теперь пример результата для операции над элементом: Допустим я хочу провести операцию над элементом id=1. Сформулирую её: Надо сдвинуть вправо на 1 клетку все элементы которые поочерёдно "вплотную" с id=1. Таких только один, это: id=2, т.е. результат выполнения задачи над id=1 будет: Код: sql 1. 2. 3. 4. 5. 6. 7. Замечу что сам элемент для которого производим операцию не смещается. Но это уже мелочи. Теперь для наглядности, приведу пример для id=3. С ним вплотную стоят id=4 и id=5, т.е. результат будет (при исходных данных, а не после операции над id=1 ): Код: sql 1. 2. 3. 4. 5. 6. 7. Это как бруски данной длины расположеные вдоль строки тетрадки в клеточку, где длина бруска кратна клеточкам этой тетради и смещая один брусок, он толкнёт те, которые вплотную с ним. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2016, 13:06 |
|
||
|
Можно ли решить данную задачу одним SQL запросом?
|
|||
|---|---|---|---|
|
#18+
kormot, Если только по горизонтали, то как-то так: Код: sql 1. 2. 3. 4. 5. 6. 7. '999' поменять на число, которое гарантированно больше изначальной позиции ('col'); 'id>3' - тут указано от какого id начинать смещение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2016, 15:23 |
|
||
|
Можно ли решить данную задачу одним SQL запросом?
|
|||
|---|---|---|---|
|
#18+
Громыхатель, попробую твой запрос тоже. А пока по наущению mini.weblab сварганил вариант не в один запрос, а с помощью рекурсивной процедуры. Заодно и с процедурами научился работать. А то до этого момента ни разу не использовал. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. Тут дополнительные аргументы в процедуре, это moveDir - чтобы двигать влево или вправо от данного. Пока не используется, но тут уже дело за малым. Всем спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2016, 16:27 |
|
||
|
Можно ли решить данную задачу одним SQL запросом?
|
|||
|---|---|---|---|
|
#18+
kormottanglir, вы всегда предлагаете решить другую задачу когда не можете решить предложеную?Какие далеко идущие выводы... позвольте поинтересоваться, на каком основании вы их сделали? авторТоже вариант. Но мне он не подходит.Вот я и пытался намекнуть на то, что условие задачи лучше оглашать сразу целиком, чтобы потом не отписываться от неподходящих решений. PS. Ряды у вас не длинные? Можете упереться в recursive limit. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2016, 05:11 |
|
||
|
|

start [/forum/topic.php?fid=47&fpage=107&tid=1831993]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
77ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
33ms |
get tp. blocked users: |
2ms |
| others: | 247ms |
| total: | 403ms |

| 0 / 0 |
