Doctrine2:左连接查询的SUM

时间:2014-09-04 18:13:19

标签: php mysql doctrine-orm dql

我正在尝试使用 Doctrine 构建查询,但我不确定是否可以完成。

我需要的是获得一个结果,显示所请求项目的ID及其数量的总和已经实现。

我有四张桌子:

  • 请求
  • RequestItems
  • 顺序
  • 的OrderItems

我可以创建请求并为此请求分配一个或多个项目,这些项目存储在 RequestItems ,然后我需要创建订单对于此请求订单必须旨在满足请求的项目,但它可能是单个订单或多个订单,因此每个订单包含一个或多个存储在 OrderItems 的项目。

以下是表格的示例:

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个订单,其中两个用于满足第一个请求,另外三个用于满足第二个请求。

前两个订单已解决了第一个请求并提供了请求的项目,因此应首先完成请求。

最后三个订单正在处理第二个请求,并已提供10个60W灯泡中的5个和80个80W暖灯泡。

我需要的是获取OrderItems的ID和数量以及OrderItems上的Qtty的SUM,这些ID由RequestItem ID分组并按订单状态和请求ID过滤

作为一个样本,我需要获取请求数量的RequestedItems,并且已经为订单状态为1的请求编号2订购了

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

此结果按其ID对请求的项目进行分组并返回请求数量,同时对此 RequestItem

的已经订购的 OrderItems 的amm进行SUM

鉴于此结果,我也可以计算待定项目。

我设法解决了这个问题,构建两个查询一个获取RequestedItems,一个获取OrderedItems并将这两个与PHP匹配,但我认为可以在数据库端执行此操作。

如果有人能帮助我,我将不胜感激。

感谢。

更新#1:

使用QueryBuilder时,我在连接中遇到子查询问题,但我设法构建一个工作查询,在连接条件中添加子查询。

我正在下面添加我的工作查询,但我仍然需要进行多项检查,看看它是否真的是我的答案。

2 个答案:

答案 0 :(得分:0)

您可以通过执行

获取示例结果
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

答案 1 :(得分:0)

似乎Doctrine不支持查询的JOIN部分中的子查询,但我设法在JOIN的条件部分添加子查询。

基于https://groups.google.com/forum/#!topic/doctrine-user/0rNbXlD0E_8,这可以通过IN解决( 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;