SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 23.10.2011 23:56:34

demiurg
Завсегдатай
Зарегистрирован: 08.05.2011
Сообщений: 46

Построчная арифметика MYSQL

Подскажите можно ли както внутри Mysql работать с данными строк по отдельности.
Т.е. например такой столбец
--------
vol1
--------
   1673
   1875
   2077
   2278
   2480
   2682
--------
Как мне вывести не значения, а разницу последующего и предидущего значений в столбце?
Т.е.
1875-1673
2077-1875
2278-2077
.............

Отредактированно demiurg (23.10.2011 23:57:35)

Неактивен

 

#2 24.10.2011 01:14:07

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Построчная арифметика MYSQL

select  vol1-@a `разница`, @a:=vol1 from `таблица` t,(select @a:=0) z;

Неактивен

 

#3 24.10.2011 02:07:49

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Построчная арифметика MYSQL

Вася, а инструкция (select @a:=0) z выполняется до запроса select  vol1-@a `разница`, @a:=vol1 from `таблица` t?
То есть если запросы идут через запятую, то выполнение идёт в обратном порядке?

Просто результат получается идентичным с результатом последовательности

set @a=0; select  vol1-@a `diff`, @a:=vol1 from `t_4852` t;


А если переменной @a присвоить значение 0 после выполнения запроса, то результат вовсе некорректный.

2demiurg: Стоит еще отсортировать таблицу по значению vol1, а то неизвестно в-общем случае в каком порядке значения будут считаны из таблицы.

Отредактированно deadka (24.10.2011 02:09:20)


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#4 24.10.2011 02:27:24

evgeny
Гуру
Зарегистрирован: 04.05.2009
Сообщений: 335

Re: Построчная арифметика MYSQL

Вася, а инструкция (select @a:=0) z выполняется до запроса select  vol1-@a `разница`, @a:=vol1 from `таблица` t?
То есть если запросы идут через запятую, то выполнение идёт в обратном порядке?

(select @a:=0) - это подзапрос, поэтому он выполняется в первую очередь.

Неактивен

 

#5 24.10.2011 02:31:54

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Построчная арифметика MYSQL

deadka написал:

Вася, а инструкция (select @a:=0) z выполняется до запроса select  vol1-@a `разница`, @a:=vol1 from `таблица` t?
То есть если запросы идут через запятую, то выполнение идёт в обратном порядке?

Просто результат получается идентичным с результатом последовательности

set @a=0; select  vol1-@a `diff`, @a:=vol1 from `t_4852` t;

Так и задумывалось smile
В данном случае "(select @a:=0) z", это не отдельный запрос, а подзапрос в части from, т.е. запятая в данном случае эквивалент join.
И если мы посмотрим explain, то увидим, что сначала идет выполнение подзапроса, в результате чего переменная @a получает начальное значение.

 
mysql> explain select  bb-@a `разница`, @a:=bb from b t,(select @a:=0) z\G
*************************** 1. row ***************************
           id: 1
  select_type: PRIMARY
        table: <derived2>
         type: system
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 1
        Extra:
*************************** 2. row ***************************
           id: 1
  select_type: PRIMARY
        table: t
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 9
        Extra:
*************************** 3. row ***************************
           id: 2
  select_type: DERIVED
        table: NULL
         type: NULL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: NULL
        Extra: No tables used
3 rows in set (0.00 sec)

Неактивен

 

#6 24.10.2011 02:33:03

demiurg
Завсегдатай
Зарегистрирован: 08.05.2011
Сообщений: 46

Re: Построчная арифметика MYSQL

Спасибо, сам бы не догадался . Неявно както  smile  Всё работает...

А вот конец строки (select @a:=0) z - ясно что обнуление перед началом первого запроса, а физически это объединение 2х запросов получается?

*******
а , понятно теперь smile


2deadka

Я сортирую по времени из другого столбца, а данные в vol1 логистически только возрастают.

Отредактированно demiurg (24.10.2011 02:37:22)

Неактивен

 

#7 24.10.2011 02:45:44

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Построчная арифметика MYSQL

Ох и конструкция smile, получается здесь идёт join без условия on с таблицей z, у которой один элемент и он равен 0?

Идея ясна, но

set @a=0; select  vol1-@a `diff`, @a:=vol1 from `t_4852` t;

так все же куда проще для понимания big_smile.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#8 24.10.2011 02:53:10

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Построчная арифметика MYSQL

Согласен, но у меня query browser каждый запрос выполняет в новой сессии, а пользовательская переменная переменная живет в течении сессии, поэтому в таких случаях, чтобы не запускать консольный клиент я пишу такое извращение.

Неактивен

 

#9 24.10.2011 02:54:39

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Построчная арифметика MYSQL

Да, mysql query browser и phpmyadmin грешат этим sad.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson