Вернуть отличные и нулевые записи из запроса на присоединение к MySQL - PullRequest
1 голос
/ 10 августа 2010

Есть ли способ вернуть отдельные значения с пустыми / нулевыми данными из объединения таблиц. Лучше всего объяснить на моем примере ниже.

Таблица "Заказы"

order_id | order_total
1        | 10
2        | 20
3        | 50

Таблица "order_items"

item_id | order_id | name     | qty_ordered | base_price | row_total
1       | 1        | Product  | 1           | 10         | 10
2       | 2        | Product  | 1           | 10         | 10
3       | 2        | Product2 | 1           | 10         | 10
4       | 3        | Product  | 2           | 10         | 20
5       | 3        | Product2 | 3           | 10         | 30

Я пытаюсь создать набор результатов, который выглядит следующим образом.

order_id | item_id | name     | qty_ordered | base_price | row_total | order_total
1        | 1       | Product  | 1           | 10         | 10        | 10
2        | 2       | Product  | 1           | 10         | 10        | 20
null     | 3       | Product2 | 1           | 10         | 10        | null
3        | 4       | Product  | 2           | 10         | 20        | 50
null     | 5       | Product2 | 3           | 10         | 30        | null

Мне нужны только order_id и order_total один раз для каждого заказа. Я полагаю, что это возможно с каким-то запросом соединения / отдельного / подзапроса, но, увы, ничего из того, что я пробовал, пока не работает

Ответы [ 2 ]

1 голос
/ 10 августа 2010

Использование:

SELECT x.order_id,
       x.item_id,
       x.name,
       x.qty_ordered,
       x.base_price,
       x.row_total,
       x.order_total
  FROM (SELECT CASE 
                  WHEN @order = o.order_id THEN NULL 
                  ELSE o.order_id 
               END AS order_id,
               oi.item_id,
               oi.name,
               oi.qty_ordered,
               oi.base_price,
               oi.row_total,
               o.order_total,
               CASE 
                  WHEN @order = o.order_id THEN NULL 
                  ELSE o.order_total 
               END AS order_total,
               @order := o.order_id
          FROM ORDER_ITEMS oi 
          JOIN ORDERS o ON o.order_id = oi.order_id
          JOIN (SELECT @order := -1) r
      ORDER BY o.order_id, oi.item_id) x
0 голосов
/ 10 августа 2010
SELECT * FROM order_items
LEFT JOIN orders
ON (
     order_items.order_id=orders.order_id
AND
     order_items.item_id=(
         SELECT MIN(item_id)
         FROM order_items a
         WHERE a.order_id=order_items.order_id
     )
)

Это должно работать, потому что вложенный запрос всегда возвращает один и тот же MIN (item_id) для каждого заказа, и он объединяется только для этого элемента.

Но это очень, очень уродливый кусок sql. Не делай этого.

...