2010-08-10 57 views
1

有什麼方法可以從表連接中返回空白/空數據的不同值。最好用下面的例子來解釋一下。從mysql連接查詢中返回distinct和null記錄

表 「訂單」

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每個訂單一次。我認爲這是可能的某種聯接/獨立/子查詢,但唉,我已經嘗試過迄今爲止工作。

回答

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 
+0

你總是讓你的SQL的樣子太美了,我需要你全面整理我的代碼。 – 2010-08-10 02:16:32

+0

哇!太棒了。是的,如此優雅的呈現,現在看起來很簡單。有點。 非常感謝。 – Bobby 2010-08-10 03:13:01

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片段。不要這樣做。