Как установить значение пользовательской переменной в ноль при изменении id? - PullRequest
0 голосов
/ 02 мая 2019

Я пытаюсь установить значение переменной в ноль всякий раз, когда идентификатор изменяется в следующем запросе.

Я пытаюсь достичь этого одним запросом без проблем с производительностью. Потому что в реальном запросе у него более 10000 записей. Вот что у меня есть,

Пример таблицы:

       create table Test(id integer, title varchar(100));
       insert into Test(id, title) values(1, "Hello");
       insert into Test(id, title) values(1, "Hello");
       insert into Test(id, title) values(1, "Hello");
       insert into Test(id, title) values(1, "Hello");
       insert into Test(id, title) values(2, "Hello");
       insert into Test(id, title) values(2, "Hello");
       insert into Test(id, title) values(1, "Hello");

Вот мой запрос:

    select a0.id,a0.title,@a:=@a+a0.id as val from
    (select * from Test order by id) as a0 
    left join
    (select id, @a:=0 from Test group by id) as a1
     on
    a0.id=a1.id

- Вывод, который я получаю при выполнении вышеуказанного запроса:

+----+-------+-----+
| id | title | val |
+----+-------+-----+
|  1 | Hello |   1 |
|  1 | Hello |   2 |
|  1 | Hello |   3 |
|  1 | Hello |   4 |
|  1 | Hello |   5 |
|  2 | Hello |   7 |
|  2 | Hello |   9 |
+----+-------+-----+

- Чего я пытаюсь достичь:

+----+-------+-----+
| id | title | val |
+----+-------+-----+
|  1 | Hello |   1 |
|  1 | Hello |   2 |
|  1 | Hello |   3 |
|  1 | Hello |   4 |
|  1 | Hello |   5 |
|  2 | Hello |   2 |
|  2 | Hello |   4 |
+----+-------+-----+

1 Ответ

0 голосов
/ 02 мая 2019

Используйте другую переменную для хранения идентификатора из предыдущего ряда.Затем вы можете проверить, совпадает ли текущий идентификатор.

При его изменении сбросьте @a к текущему идентификатору (не 0).

SELECT a0.id, a0.title, @a := IF(a0.id = @last_id, @a + a0.id, a0.id) AS val, @last_id := a0.id
FROM (SELECT * FROM Test ORDER BY id) AS a0
CROSS JOIN (SELECT @a := 0, @last_id := null) AS vars

DEMO

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...