从mysql连接查询中返回distinct和null记录

时间:2010-08-10 02:00:32

标签: mysql join distinct

有没有办法从表连接中返回带有空/空数据的不同值。最好用下面的例子来解释。

表“订单”

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 个答案:

答案 0 :(得分:1)

使用:

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

答案 1 :(得分:0)

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片段。不要这样做。