MySQL разница в исчислении в запросе выбора

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

+----------+----------+
| 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'

Я хочу выбрать все данные, но также включить столбец для разницы в баллах (с учетом предложения WHERE), чтобы результат был примерно таким

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

Возможно ли достичь этого всего лишь одним запросом выбора?

Спасибо

1

Решение

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 любой столбец.

2

Другие решения

Во-первых, вам нужно добавить столбец приращения к вашей таблице. в моем примере это называется (без сюрпризов) «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";

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

0

По вопросам рекламы [email protected]