2013-03-08 30 views
0

我對Mysql很陌生,需要幫助,試圖結合兩個mysql查詢,從命令總數中爲每個「storeid」給出「總計」。我目前使用兩個查詢得到的結果:Summing命令總計Mysql

SELECT storeid, storenum, name FROM store ORDER BY storeid DESC 

SELECT SUM((1+0.07125)*qty*discprice) as total FROM items WHERE orderid IN (SELECT orderid  FROM orders WHERE store = '".$row['storeid']."' AND date >= '2012-01-01' AND date < '2013-01-01') 

我運行一個while循環運行的「STOREID」第二個查詢。不過,我知道我可以做到這一點是由「storeid」一個查詢和組合,併爲所有商店合併創建一個總計。但我無法弄清楚。

謝謝!

+0

查看[Sub Queries](http://dev.mysql.com/tech-resources/articles/subqueries_part_1.html)。 – Brian 2013-03-08 00:25:47

回答

1
SELECT s.storeid, s.storenum, s.name 
     SUM((1+0.07125)*i.qty*i.discprice) AS total 
FROM items AS i 
LEFT JOIN orders AS o 
    ON i.orderid=o.orderid 
LEFT JOIN stores AS s 
    ON o.store=s.storeid 
WHERE o.date >= '2012-01-01' 
    AND o.date < '2013-01-01' 
GROUP BY s.storeid, s.storenum, s.name; 
+0

謝謝!我將不得不看一下Sub Queries鏈接並研究這個查詢來明確它是如何工作的,但我開始理解這個概念。 – XanderNGCC 2013-03-08 03:57:46

+0

@XanderNGCC它不使用子查詢,您的原始查詢使用它們,但這只是使用和外連接。 – 2013-03-08 10:36:42

1

訣竅是加入三個表,然後在items表上使用聚合函數。

SELECT stores.storeid, stores.storenum, stores.name, SUM((1+0.07125)*items.qty*items.discprice) as total 
FROM stores 
LEFT JOIN orders ON orders.storeid=stores.storeid AND orders.date>='2012-01-01' AND orders.date<'2013-01-01' 
LEFT JOIN items ON items.orderid=orders.orderid 
GROUP BY stores.storeid, stores.storenum, stores.name 

這樣做是什麼這樣的:

這將選擇從stores表每家商店,並在那家商店總結訂單。我選擇了LEFT JOIN而不是直JOIN,因此在該時間範圍內沒有任何順序的商店仍將顯示總數爲NULL。

P.S.我沒有數據庫模式的副本,上面的SQL查詢可能實際上並不像預期的那樣工作 - 它只是爲了指出您正確的方向。

+0

請不要傳播壞習慣。你應該只選擇你分組或聚合的列。該查詢在MySQL以外的任何其他數據庫中都不起作用。在這種情況下,它不會產生錯誤的結果,但在其他這樣的習慣意志中。 – 2013-03-08 00:51:00

+0

你說對了,標準SQL將需要GROUP BY子句中的額外列。只有在理解這些符號的可能含義時才應該使用它,因此這對於剛剛進入(My)SQL的人來說是個不好的例子。我會相應地編輯我的答案。 – Hazzit 2013-03-08 01:00:17

+0

現在是您的答案了嗎?我只是第一次看它,所以我沒有任何可以比較的地方。我假設你最初只包含GROUP BY子句中的一列,而不是全部三列? – XanderNGCC 2013-03-08 04:00:25