MySQL:获取行集中每个排序列的差异

时间:2008-11-02 18:44:37

标签: mysql stored-procedures

以下是表格字符的简单方案:

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 个答案:

答案 0 :(得分:2)

你的桌子上有你的身份证。

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 :(得分:1)

使用临时表的一种可能解决方案:

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;

当然,如果您的 id 列符合您在输出中所需的顺序,则Eoin的解决方案会更好。