假设我有一个包含以下内容的数据库:
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,订单项列表,订单总额和送货地址。
如果不对每个订单进行查询以获取订单项和送货信息,最好的方法是什么?
我是否应该有包含以下内容的视图:
order_id, line_item_quantity, line_item_price, product_name, line_item_total, shipping_address
然后在应用程序代码中按顺序ID分组?这是我能想到的最好的,但它看起来很草率(当然,在现实世界中,每个表格中会有更多的信息和更多的表格。)
答案 0 :(得分:1)
您需要展平关系,并按订单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更改时,是时候设置一组新的订单。
例如,如果您使用水晶报表,则只需在订单ID上设置新的分组,它就会自动对订单进行分段。