2014-12-29 18 views
1

我想知道是否有可能在选择查询中执行基本的数学运算。假设我有以下表格选择查询中的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  | 
+----------+----------+------------+ 

是否有可能实现这一目标只有一个选择查询?

感谢

+0

您需要告诉我们“差异”是如何计算的,即“人2分数 - 人1分数=差异”? – cmorrissey

+0

差异是什么? –

+0

对不起,那不是很清楚吗?差异将是当前分数和同一个人以前的分数之间的差异。即在第2行,差异是8 - 5.第四行是3 - 8等 – Typhoon101

回答

2
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任何列上面的查询。

+0

谢谢。这几乎是SOOO。我只有两个问题。首先,'@prevId:= u.id作为currentId'行是必要的?它似乎只是为ID添加一列,但我已经在其他地方有了。我可以没有它吗?其次,第一行似乎是计算最后一行的第一个分数和分数之间的差异。这可以为零,而不是第一行没有上一行? (希望有道理) – Typhoon101

+0

该行设置在它上面的行中使用的@prevId变量。为了正确设置变量,你需要在select语句中拥有该列。 –

+0

对不起,我感谢你的帮助,但是这已经停止了我的工作。这是我的实际设置。 [SQL FIDDLE](http://sqlfiddle.com/#!2/00af1/1)。我的表格显示了一个人在给定的一周内按照体重(磅)选择了多少水果。 (这是我为女儿建造的教育游戏的一部分)。我看到的错误是[2014-12-29 23:23:19] [22007] [1292]截断不正确的DOUBLE值:'8kzMZfXFNv1dGEY'' – Typhoon101

0

首先,您需要在表中添加一个增量列。在我的例子中它被称为(没有惊喜)'id'。这是一个自动增量。你当前的表看起来不像它有一个可能的主键,所以自动增量列无论如何是个好主意。

该解决方案使用一些简单的子选择来获得比当前所选行的id小的最大id,即'previous'行。从那里简单的减法得到分数的差异。

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"; 

希望这个窍门!