2015-02-07 70 views
0

我有一個MySQL表中選擇兩個值,就像這樣:我怎麼能減去表

CREATE TABLE IF NOT EXISTS `ladderStandard` (
    `charId` mediumint(8) unsigned NOT NULL, 
    `poeRank` smallint(5) unsigned NOT NULL, 
    `lvl` tinyint(3) unsigned NOT NULL, 
    `exp` int(10) unsigned NOT NULL, 
    `ladderTime` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 


INSERT INTO `ladderStandard` (`charId`, `poeRank`, `lvl`, `exp`, `ladderTime`) VALUES 
(10000, 10000, 91, 2108226870, '2015-02-06 23:37:11'), 
(10001, 10001, 91, 2108221545, '2015-02-06 23:37:11'), 
(10002, 10002, 91, 2108219833, '2015-02-06 23:37:11'), 
(10003, 10003, 91, 2108192924, '2015-02-06 23:37:11'), 
(10004, 10004, 91, 2108154502, '2015-02-06 23:37:11'), 
(10005, 10005, 91, 2108153763, '2015-02-06 23:37:11'), 
(10000, 9998, 91, 2108226870, '2015-02-06 23:58:21'), 
(10001, 9999, 91, 2108221545, '2015-02-06 23:58:21'), 
(10002, 10000, 91, 2108219833, '2015-02-06 23:58:21'), 
(10003, 10001, 91, 2108192924, '2015-02-06 23:58:21'), 
(10004, 10002, 91, 2108154502, '2015-02-06 23:58:21'), 
(10005, 10003, 91, 2108153763, '2015-02-06 23:58:21'), 

我有兩個疑問:

SELECT charId, exp FROM ladderStandard WHERE ladderTime = '2015-02-06 23:37:11'; 
SELECT charId, exp FROM ladderStandard WHERE ladderTime = '2015-02-06 23:58:21'; 

現在我想減去這些兩個查詢得到charIdexp.from.first.query - exp.from.second.query

這是sqlfiddle.com的示例。

回答

0

你需要加入這兩個查詢,然後做數學

SELECT a.charid, 
     a.exp - b.exp 
FROM (SELECT charId, 
       exp 
     FROM ladderStandard 
     WHERE ladderTime = '2015-02-06 23:37:11') a 
     JOIN (SELECT charId, 
        exp 
      FROM ladderStandard 
      WHERE ladderTime = '2015-02-06 23:58:21') b 
     ON a.charid = b.charid 

SqlFiddle Demo

0

使用自聯接。 WHERE子句將限制表的每個子集到特定時間,並且ON子句鏈接相應的行。

SELECT a.charid, a.exp - b.exp AS diff 
FROM ladderStandard AS a 
JOIN ladderStandard AS b ON a.charid = b.charid 
WHERE a.ladderTime = '2015-02-06 23:37:11' 
AND b.ladderTime = '2015-02-06 23:58:21' 

DEMO

+0

嗨,先生,只是一個小的澄清。想到提出這個答案。哪一個會有更好的表現。我在加入之前過濾記錄。這是否與此相同 – 2015-02-07 02:44:28

+0

有關不同的EXPLAIN輸出,請參閱http://sqlfiddle.com/#!2/e2de71/13。如果您在'WHERE'和'ON'中使用的列上添加索引,則爲http://sqlfiddle.com/#!2/9244a8/1。 – Barmar 2015-02-07 13:17:07

0

在您的樣本數據,所述exp值是針對兩組中相同的ID相同。所以從另一箇中減去一個就會導致零。

但是,假設您的實際數據具有不同的值,則可以在不加入表的情況下執行操作。

SELECT CharId, 
     Sum(case LadderTime 
      when :SecondDate then exp 
      else -exp end)as SumExp 
FROM LadderStandard 
where LadderTime in(:FirstDate, :SecondDate) 
group by CharID; 

如所預期的,這SQL Fiddle示出了除了CharID = 10291,其具有在第二組中的條目而不是第一全零。在這種情況下,計算結果爲0 - exp.from.second.query,這只是exp值的負值。

+0

從小提琴的例子工程...但它不是我所需要的,因爲在全表中我有每個CharId數百個時間戳。我當時只想減去其中的兩個。你在這裏展示的東西有點不同,但它不起作用,或者我不明白,糾正我,如果我worng,而不是:FirstDate和:Secondate我應該把我的tmiestamps像''2015-02-06 23: 37:11'' – XnIcRaM 2015-02-09 23:24:40

+0

在小提琴中,我對時間值進行了硬編碼。但是在上面顯示的查詢中,我假設你將兩個感興趣的日期存儲在變量中,所以我就是這樣寫的。有關使用變量的示例,請參閱http://sqlfiddle.com/#!2/e2de71/20/0。而且,順便說一句,如果您正在尋找的解決方案取決於其他標準,請在原始問題中說明。 – TommCatt 2015-02-09 23:50:45