Как правильно запрашивать в базе данных результаты, содержащие списки - PullRequest
1 голос
/ 07 января 2012

Скажем, у меня есть база данных, которая содержит следующее:

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

Таким образом, должен отображаться список заказов для каждого заказа, идентификатор, список позиций, общая сумма заказа и адрес доставки.

Каков наилучший способ сделать это, не выполняя запрос для каждого заказа для получения позиций и информации о доставке?

Должен ли я иметь представление, которое содержит следующее:

order_id, line_item_quantity, line_item_price, product_name, line_item_total, shipping_address

А затем группировать по идентификатору заказа в коде приложения? Это лучшее, что я могу придумать, но это выглядит неаккуратно (и, конечно, в реальном мире в каждой таблице будет гораздо больше информации и намного больше таблиц).

1 Ответ

1 голос
/ 07 января 2012

Вам необходимо сгладить отношения и отсортировать их по идентификатору заказа:

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

Затем, в зависимости от того, как вы строите свой отчет, попытайтесь обнаружить изменения идентификатора заказа при циклическом просмотре полученных строк.Когда идентификатор заказа изменяется, настало время установить новый набор заказа.

Например, если вы используете отчеты Crystal, вам просто нужно установить новую группировку по идентификатору заказа, и он будет автоматически сегментированзаказы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...