2012-02-22 71 views
1

我有一個表,很多看起來像這樣的列:解決這個與SQL或PHP - 性能

id-name-date---pcs 
1 - x - 01-01 -10 
2 - y - 01-01 -15 
3 - z - 01-01 -8 
4 - x - 02-01 -25 
5 - y - 02-01 -10 
6 - z - 02-01 -5 

我希望做的是一個查詢,顯示個人電腦的開發/差異名,一個月antoher(在這種情況下,二月和Jan),這樣之間:

id-name-pcs 
1 - x - (15) 
2 - y - (-5) 
3 - z - (-3) 

是否有可能只與SQL做到這一點還是需要涉及到PHP?

如果我循環遍歷所有行並在PHP中進行計算,它是否會對服務器產生顯着影響?

在此先感謝!

編輯:圓括號不是假設爲查詢結果的一部分。只爲這個線程。

回答

2

我所用的技術是加入2月份部分表的部分月份,然後找到的差異。
看到查詢波紋管(假設gsub是你的表名)

SELECT 
    g1.id, g1.name, g2.pcs-g1.pcs `pcs` 
FROM 
    gsub AS g1 
INNER JOIN 
    gsub AS g2 
ON 
    (g1.name=g2.name 
    AND 
    month(g1.`date`) = 1 
    AND 
    month(g2.`date`) = 2); 

結果

+----+------+------+ 
| id | name | pcs | 
+----+------+------+ 
| 1 | x | 15 | 
| 2 | y | -5 | 
| 3 | z | -3 | 
+----+------+------+ 
+0

嗯不能得到這個工作。我看到邏輯,但它返回0行。 我將它改爲LIKE「2012-02%」和01%(我的格式是yyyy-mm-dd),但仍然沒有成功。我在兩個月內增加了兩個相同的名字。 – Josef 2012-02-22 22:26:30

+0

@Josef你的'日期'列的格式是什麼?也是'日期'類型? – 2012-02-22 22:28:11

+0

這是一個時間戳,yyyy-mm-dd hh:mm:ss,但應該像「2012-02%」這樣的格式?我用它來分組和東西,這很好 – Josef 2012-02-22 22:32:17

0

我會做表的JOIN與自身,就像這樣:

SELECT t1.name, t1.pcs AS 'pcs at 01-01', t2.pcs AS 'pcs at 02-02', t1.pcs - t2.pcs AS diff 
FROM table t1 
JOIN table t2 ON (t1.name = t2.name AND t2.date = '02-01') 
WHERE t1.date = '01-01'; 

注意t1t2是同一個表不同的別名。

另外:需要由特定的數據庫表名被取代,日期必須是有效的格式('01 -01' 和'02 -01' 將無法正常工作 - 使用列類型的完整日期格式)。


對於更復雜的東西,我通常會做一個或兩個數據庫查詢,並在PHP端執行計算。我曾經將一個花費一分鐘時間的大型查詢轉換成幾個混合了PHP循環的查詢,後者幾乎立即運行。

但是,就你而言,目標可以通過一個簡單的SQL查詢來實現,它不會損害性能。

+0

謝謝,但同樣在這裏,返回0行。是的,這就是爲什麼我問,這將是一個更復雜的查詢。 – Josef 2012-02-22 22:29:00

+0

它應該工作。你是否已將date = '01 -01''更改爲有效日期,並且查詢中需要更改爲特定需求的所有其他部分(表名等)? – 2012-02-22 22:37:06

+0

是的,不要錯誤。只有0行。 – Josef 2012-02-23 09:41:51

0

你問的方式,我甚至不應該回答(未來,告訴我們,你已經嘗試過)。如果你還沒有嘗試任何事情,在開始時是這樣的:

select name, sum(pcs) from mytable where cast(substring(date,0,2),UNSIGNED)<2 group by name order by sum(pcs) 
+0

謝謝!我剛剛意識到我的表述是不合理的。我還沒有嘗試過任何東西,因爲我不知道如何開始。而且,我的問題是關於性能。我知道如何與PHP的幫助,這將是最簡單的解決方案。但也許不是最好的。我會盡力與你的答案一起工作。 – Josef 2012-02-22 22:12:33

+0

重新閱讀你的問題後,我認爲你最好用上面的方法之一。我的東西只是增加了數量,這不是你想要的。 – mindandmedia 2012-02-22 22:15:13