2014-12-29 19 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"; 

希望這個竅門!