2014-12-29 4 views
1

Мне было интересно, можно ли сделать базовую математику в выбранном запросе. Скажем, у меня есть следующая таблицаРазница в вычислениях MySQL в запросе select

+----------+----------+ 
| name  | score | 
+----------+----------+ 
| Person 1 |  5 | 
+----------+----------+ 
| Person 1 |  8 | 
+----------+----------+ 
| Person 1 |  3 | 
+----------+----------+ 
| Person 2 |  7 | 
+----------+----------+ 
| Person 1 |  9 | 
+----------+----------+ 

В настоящее время для получения данных используется следующее.

SELECT * FROM my_table WHERE name='Person 1' 

Я хочу, чтобы выбрать все данные, но и включать колонку для разности баллов (с учетом ИНЕК во внимание), так что результат будет что-то вроде

+----------+----------+------------+ 
| name  | score | difference | 
+----------+----------+------------+ 
| Person 1 |  5 |  0  | 
+----------+----------+------------+ 
| Person 1 |  8 |  3  | 
+----------+----------+------------+ 
| Person 1 |  3 |  -5 | 
+----------+----------+------------+ 
| Person 1 |  9 |  6  | 
+----------+----------+------------+ 

Можно ли добиться этого с помощью только одного запроса выбора?

Благодаря

+0

вам нужно рассказать нам, как вычисляется «разница», т.е. «человек 2 оценка - человек 1 оценка = разница» ?? – cmorrissey

+0

Разница в чем? –

+0

Извините, это было не очень понятно, не так ли? Разница была бы разницей между текущим счетом и предыдущим счетом для одного и того же человека. то есть в строке 2 разница составляет 8 - 5. В четвертом ряду это 3-8 и т. д. – Typhoon101

ответ

2
SELECT 
    u.name, 
    u.score, 
    IFNULL((u.score - (SELECT score FROM users WHERE id = @previd)), 0) as difference, 
    @prevId := u.id as id 
FROM users u, (SELECT @previd :=0) c 
WHERE name = "Person 1" 

SQL FIDDLE

С выше запроса вы можете ORDER BY любой столбец.

+0

Спасибо. Это СООО почти это. У меня всего два вопроса. во-первых, нужна строка '@prevId: = u.id as currentId'? Кажется, просто добавьте столбец для идентификатора, но у меня уже есть это в другом месте. Могу ли я обойтись без этого? Во-вторых, первая строка, по-видимому, вычисляет разницу между первым счетом и счетом в последней строке.Может ли это быть нулевым, так как первая строка не имеет предыдущей строки? (надеюсь, что это имеет смысл) – Typhoon101

+0

Эта строка устанавливает переменную @prevId, которая используется в строке над ней. чтобы правильно установить переменную, вам нужно иметь этот столбец в инструкции select. –

+0

Прошу прощения, я ценю вашу помощь, но это перестало работать для меня. Вот моя фактическая установка. [SQL FIDDLE] (http://sqlfiddle.com/#!2/00af1/1). Моя таблица показывает, сколько фруктов выбрал человек за неделю в неделю (фунты). (это часть образовательной игры, которую я собираю для своей дочери). Ошибка, которую я вижу, это '[2014-12-29 23:23:19] [22007] [1292] Усеченное неправильное значение DOUBLE: '8kzMZfXFNv1dGEY'' – Typhoon101

0

Во-первых, вам нужно будет добавить столбец приращений в таблицу. в моем примере это называется (без сюрпризов) 'id'. это автоинкремент. ваша текущая таблица не выглядит так, как будто у нее есть возможный первичный ключ, поэтому столбец с автоматическим добавлением является хорошей идеей.

Это решение использует некоторые простые подзапросы, чтобы получить самый большой идентификатор, который меньше, чем идентификатор текущей строки, которую вы выбираете, то есть «предыдущая» строка. оттуда это простое вычитание, чтобы получить разницу в счете.

select a.id, 
     a.name, 
     a.score, 
     a.score-(select score 
       from  my_table 
       where id=(select max(id) 
          from  my_table 
          where id<a.id 
          and  name="person 1")) as difference 
from my_table a 
where name="person 1"; 

надеюсь, что это делает трюк!

Смежные вопросы