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