powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите разобраться с HAVING
7 сообщений из 7, страница 1 из 1
Помогите разобраться с HAVING
    #39201304
kormot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго вечера!

Есть у меня таблица в которой описаны элементы. У каждого элемента есть координаты: номер колонки и номер строки в которой он находится. И длина (количество занимаемых ячеек).
Код: sql
1.
2.
3.
4.
5.
6.
TABLE elements (
   id    SERIAL,
   row   INT UNSIGNED NOT NULL,
   col   INT UNSIGNED NOT NULL,
   len   INT UNSIGNED NOT NULL
)


Эти элементы располагаются в клеточках одной строки не пересекаясь. Т.е. отрезки [col, col+length] элементов одной строки в таблице не пересекаются.

Задача такая:
Мне надо сдвинуть все элементы правее данного элемента ( $ELEMENT_ID ) вправо на одну ячейку. Причём элементы надо сдвигать только те которые стоят подряд вплотную к искомому элементу.
Ну т.е. если описаны 3 элемента (колонка:длина):
=======================================
(1:2) (3:1) (6:3), то при выполнении нужной мне операции для первого элемента, должен сдвинуться лишь второй элемент, т.к. только он вплотную с первым стоит и результат должен быть:
(1:2) (4:1) (6:3)

А для набора: (1:2) (3:1) (4:3) при такой же операции для первого элемента, сдвинутся второй и третий, т.к. они влотную с первым стоят и результат должен быть:
(1:2) (4:1) (5:3)


Как я пытаюсь это сделать:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
UPDATE   elements   AS aa
JOIN   (   
           SELECT   a1.id AS id,  MAX(a1.col+a1.len) AS mx, (b1.col+b1.len) AS mn,  SUM(a1.len) AS sm 
             FROM   elements AS a1
             JOIN   elements AS b1 ON b1.row=a1.row
            WHERE   a1.col>b1.col 
               AND  b1.id = $ELEMENT_ID
           GROUP BY a1.row
           HAVING   mx-mn=sm
       )            AS bb ON bb.id=aa.id
SET aa.col=aa.col+1



т.е. выбираю элементы правее данного (a1.col>b1.col) и пытаюсь ограничить выборку условием что они вплотную к нему, т.е. максимальная разница координат концов выбранных элементов с данным должна быть равна сумме длин выбраных элементов.

Но не выходит почему-то. Может я не правильно понимаю смысл HAVING?
...
Рейтинг: 0 / 0
Помогите разобраться с HAVING
    #39201307
kormot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сам понял одну из ошибок в запросе, мне ведь в подзапросе надо получить все элементы вплотную и правее чем данный, а я их сгруппировав по номеру строки получаю всегда один элемент. Т.е. как минимум запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
UPDATE   elements   AS aa
JOIN   (   
           SELECT   a1.id AS id
             FROM   elements AS a1
             JOIN   elements AS b1 ON b1.row=a1.row
            WHERE   a1.col>b1.col 
               AND  b1.id = $ELEMENT_ID
           HAVING   MAX(a1.col+a1.len)-(b1.col+b1.len)=SUM(a1.len)
       )            AS bb ON bb.id=aa.id
SET aa.col=aa.col+1


Но один фиг выдаёт один элемент :(
Помогите разобраться пожалуйста.
...
Рейтинг: 0 / 0
Помогите разобраться с HAVING
    #39201348
kormot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемые, подскажите мне пожалуйста как получить в озвученой таблице для данного элемента, суммы длин элементов которые правее данного?

Т.е. если есть в таблице данные:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
----------------------------
| id     | col    | len    |
----------------------------
| 1      | 1      | 1      |
| 2      | 2      | 2      |
| 3      | 4      | 1      |
| 4      | 7      | 2      |
| 5      | 9      | 1      |
| 6      | 10     | 3      |
| 7      | 13     | 1      |
----------------------------


то получить для id=4 результат, суммы длин от 5-го до каждого из тех которые правей него, т.е.
Код: sql
1.
2.
3.
4.
5.
6.
7.
----------------------
| id     | sumLen    |
----------------------
| 5      | 1         |
| 6      | 4         |
| 7      | 5         |
----------------------


Не могу сам что-то допереть. А такого запроса мне для решения изначальной задачи хватит.
...
Рейтинг: 0 / 0
Помогите разобраться с HAVING
    #39201349
kormot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kormot,

то получить для id=4 результат, суммы длин от 5-го до каждого из тех которые правей него, т.е.
на самом деле
то получить для id=4 результат, суммы длин от 4-го до каждого из тех которые правей него, т.е.
...
Рейтинг: 0 / 0
Помогите разобраться с HAVING
    #39201424
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так и считаете
SELECT SUM(t.len) from elements as t where t.id>4
...
Рейтинг: 0 / 0
Помогите разобраться с HAVING
    #39201459
kormot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_Ustinov,
Но в таком случае результатом будет одно число - сумма всех длин начиная с какого-то элемента.

А мне надо суммы длин от данного до каждого из последующих элементов. Т.е. от 4-го до 5-го, от 4-го до 6-го, от 4-го до 7-го и т.д.
...
Рейтинг: 0 / 0
Помогите разобраться с HAVING
    #39201681
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите разобраться с HAVING
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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