2014-09-04 59 views
0

我想與Doctrine建立查詢,但我不知道是否可以完成。Doctrine2:SUM在左加入查詢

我需要的是得到一個結果,顯示一個請求物品的ID和它的SUM數量已經滿足。

我有四個表:

  • 請求
  • RequestItems
  • 訂購
  • 的OrderItems

我可以創建一個請求,並指定一個或多個項目到這個請求它們存儲在RequestItems,然後我需要創建一個訂單這個請求,則訂單必須致力於滿足要求的項目,但它可能是與單個訂單或多重的,因此每個訂購包含一個或多個存儲在訂單項的物品。

以下是表的一個示例:

Request 
| ID | Date  | 
|----|------------| 
| 1 | 2014-05-12 | 
| 2 | 2014-05-13 | 

RequestItems 
| ID | RequestID | Name    |Qtty | 
|----|-----------|---------------------|-----| 
| 1 |   1 | 60W Light Bulb  | 5 | 
| 2 |   1 | Bticino switch  | 3 | 
| 3 |   2 | 60W Light Bulb  | 10 | 
| 4 |   2 | 80W Light Bulb Warm | 15 | 

Order 
| ID | RequestId | Date  | State | 
|----|-----------|------------|-------| 
| 1 |   1 | 2014-05-14 |  1 | 
| 2 |   1 | 2014-05-15 |  1 | 
| 3 |   2 | 2014-05-15 |  1 | 
| 4 |   2 | 2014-05-16 |  1 | 
| 5 |   2 | 2014-05-17 |  1 | 

OrderItems 
| ID | RequestItemsID | OrderID | Qtty | 
|----|----------------|---------|------| 
| 1 |    1 |  1 | 5 | 
| 2 |    2 |  2 | 3 | 
| 3 |    3 |  3 | 2 | 
| 4 |    3 |  4 | 2 | 
| 5 |    3 |  5 | 1 | 
| 6 |    4 |  5 | 10 | 

這裏我有兩個要求: 第1號:已請求(5個60W燈泡,3個BTICINO開關) 第2號兩個項目:有一個項目要求(10 60W燈泡,15 80W暖燈泡)

對於這些要求,我已經創建了5個訂單,其中兩個履行第一個要求,3個履行第二個要求。

前兩個訂單處理了第一個請求並提供了請求的項目,因此第一個請求應該完成。

最後三個訂單正在處理第二個請求,並提供了10個60W燈泡中的5個和80W溫暖燈泡中的10個。

什麼我需要在這裏得到ID和RequestItems的數量和Qtty的由RequestItem ID分組過濾通過訂單狀態的OrderItems和請求ID

作爲樣品我需要得到的總和多少RequestedItems所提出的要求,並已訂購了請求第2號,其中其訂單狀態爲1個

| RequestItemsID | QttyRequested | QttyOrdered (SUM) | 
|----------------|---------------|-------------------| 
|    3 |   10 |     5 | 
|    4 |   15 |    10 | 

這一結果分組通過其ID請求的項目,並返回請求的數量,還總和已經下令ammounts 訂購項目爲此RequestItem

鑑於此結果,我也可以計算未決項目。

我已經設法解決這個問題,構建兩個查詢一個獲取RequestedItems,一個獲取OrderedItems並將這兩個與PHP匹配,但我認爲可以在數據庫端執行此操作。

如果有人能幫助我,這將是非常感謝。

謝謝。

更新#1:

我有問題,裏面使用的QueryBuilder當聯合子,但我設法建立一個工作查詢,將在連接條件的子查詢。

我在下面添加我的工作查詢,但我仍然需要做多個檢查,看看它是否真的是我的答案。

回答

0

獲得示例結果似乎主義犯規支持子查詢的查詢的連接部分,但是我設法在我的JOIN條件部分添加一個子查詢。

基於https://groups.google.com/forum/#!topic/doctrine-user/0rNbXlD0E_8這可以用(SUBQUERY

這是什麼工作,現在給出了OP的例子

SELECT ri.ID AS RequestItemsID, ri.Qtty AS QttyRequested, COALESCE(SUM(oi.Qtty), 0) AS QttyOrdered 
FROM RequestItems AS ri 
LEFT JOIN OrderItems AS oi ON oi.RequestItemsID = ri.ID AND oi.OrderID IN (
    SELECT o.ID FROM Order AS o WHERE o.State = 1 AND o.RequestID = 2 
) 
WHERE ri.RequestID = 2 
GROUP BY ri.ID; 
1

你可以通過執行

SELECT ri.ID AS RequestItemsID, ri.Qtty AS QttyRequested, 
     SUM(oi.qtty) AS QttyOrdered 
FROM RequestItems ri 
INNER JOIN Order AS o ON o.RequestId = ri.RequestId 
INNER JOIN OrderItems AS oi ON oi.OrderId = o.ID 
WHERE ri.RequestId = 2 AND o.State = 1 
GROUP BY ri.RequestId, o.State 
+0

謝謝你,我想你的查詢,但是它沒有得到解決工作,首先我需要改變GroupBy,因爲我需要通過RequestItem ID進行分組,而不是RequestID,之後我發現了兩個問題,SUM在每一行執行,所以如果我有多個RequestItem,每個都有相同的SUM結果,第二,如果沒有添加OrderItems我沒有得到RequestItem在結果集中。 我正在更新OP以更具體 – 2014-09-05 02:13:47