假设我有一个包含以下内容的数据库:
orders(id, total, address_id)
line_items(id, product_id, order_id, quantity, price)
products(id, name, price)
addresses(id, address)
我需要提供包含以下内容的报告:
Order #123
Line Items
3 x Product 1 @ $3 = $9
2 x Product 2 @ 1 = $2
Total: $11
Shipping: 123 Main Street
Order #124
Line Items
1 x Product 1 @ $3 = $3
1 x Product 2 @ 1 = $1
Total: $4
Shipping: 456 Jones Ave
因此,需要显示订单列表,对于每个订单,需要显示 id、订单项列表、订单总计和送货地址。
在不查询每个订单以获取订单项和运输信息的情况下,执行此操作的最佳方法是什么?
我是否应该有一个包含以下内容的 View :
order_id, line_item_quantity, line_item_price, product_name, line_item_total, shipping_address
然后在应用代码中按订单id分组?这是我能想到的最好的办法,但它看起来很草率(当然,在现实世界中,每个表中会有更多的信息,而且还有更多的表)。
最佳答案
您需要将关系展平,并按订单 ID 排序:
select O.id, L.quantity, P.name, P.price, A.address,
L.quantity * P.price subtotal,
(
select sum(L1.quantity * P1.price)
from line_items L1
inner join products P1 on L1.product_id = P1.id
where L1.order_id = O.id
) ordertotal
from orders O
inner join line_items L on O.id = L.order_id
inner join products P on L.product_id = P.id
inner join addresses A on O.address_id = A.id
order by O.id, L.id
然后根据您构建报告的方式,尝试在遍历生成的行时检测订单 ID 的变化。当订单ID发生变化时,就需要建立一套新的订单。
例如,如果你使用 Crystal 报表,你只需要在订单ID上设置一个新的分组,它就会自动对订单进行分割。
关于sql - 如何正确查询数据库以获取包含列表的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8768716/