MySQL: получить различия каждого отсортированного столбца в наборе строк - PullRequest
1 голос
/ 02 ноября 2008

Вот простой сценарий с символами таблицы:

CharacterName GameTime Gold Live
Foo 10 100 3 
Foo 20 100 2 
Foo 30 95 2

Как получить этот вывод для запроса SELECT Gold, Live FROM characters WHERE name = 'Foo' ORDER BY GameTime:

Gold Live
100 3
0 -1
-5 0

используя хранимую процедуру MySQL (или запрос), если это вообще возможно? Я думал об использовании 2-х массивов, например, как это обычно делается на серверном языке, но MySQL не имеет типов массивов.

Хотя я знаю, что это, вероятно, легче сделать в PHP (мой язык на стороне сервера), я хочу знать, возможно ли это сделать в MySQL, просто как учебный материал.

Ответы [ 2 ]

2 голосов
/ 02 ноября 2008

У вас есть идентификатор на вашем столе.

GameID      CharacterName GameTime    Gold        Live
----------- ------------- ----------- ----------- -----------
1           Foo           10          100         3
2           Foo           20          100         2
3           Foo           30          95          2

Если это так, вы можете сделать шахматное соединение на себя

SELECT
    c.CharacterName, 
    CASE WHEN c_offset.Gold IS NOT NULL THEN c.Gold - c_offset.Gold ELSE c.Gold END AS Gold,
    CASE WHEN c_offset.Live IS NOT NULL THEN c.Live - c_offset.Live ELSE c.Live END AS Live
FROM Characters c 
    LEFT OUTER JOIN Characters c_offset
        ON c.GameID - 1 = c_offSet.GameID
ORDER BY
    c.GameTime

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

CharacterName Gold        Live
------------- ----------- -----------
Foo           100         3
Foo           0           -1
Foo           -5          0
1 голос
/ 02 ноября 2008

Одно из возможных решений с использованием временной таблицы:

CREATE TABLE characters_by_gametime (
  id INTEGER AUTO_INCREMENT PRIMARY KEY,
  gold INTEGER,
  live INTEGER);

INSERT INTO characters_by_gametime (gold, live)
SELECT gold, live
FROM characters
ORDER BY game_time;

SELECT
  c1.id,
  c1.gold - IFNULL(c2.gold, 0) AS gold,
  c1.live - IFNULL(c2.live, 0) AS live
FROM
  characters_by_gametime c1
  LEFT JOIN characters_by_gametime c2
    ON c1.id = c2.id + 1
ORDER BY
  c1.id;

Конечно, решение Eoin лучше, если ваш столбец id соответствует порядку, который вы хотите в выводе.

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