以下是表格字符的简单方案:
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中做,只是作为一种学习材料。
答案 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的解决方案会更好。