2014-10-07 139 views
2

我有3個表,LEFT JOIN在笨

itemmaster 
|--------|----------| 
| id | name | 
|--------|----------| 
| 1 | Pizza | 
|--------|----------| 
| 2 | Burger | 
|--------|----------| 
| 3 | Pepsi | 
--------------------- 

    order 
    |--------|----------| 
    |orderid | date | 
    |--------|----------| 
    | 1 | 1-1-11 | 
    |--------|----------| 
    | 2 | 2-1-11 | 
    |--------|----------| 
    | 3 | 3-1-11 | 
    --------------------- 


      orderdetails 
     |--------|-------------|---------|---------| 
     | id | orderid |itemid |quantity | 
     |--------|-------------|---------|---------| 
     | 1 | 1   | 1  | 10  | 
     |--------|-------------|---------|---------| 
     | 2 | 1   | 2  | 20  | 
     |--------|-------------|---------|---------| 
     | 3 | 2   | 1  | 10  | 
     ------------------------------------------- 

我想加入這3個表來獲取放置在特定日期的訂單項的數量。 我已經試過是

$this->db->from('itemmaster'); 
$this->db->join('orderdetails', 'orderdetails.itemid= itemmaster.id','left'); 
$this->db->join('order', 'order.orderid= orderdetails.orderid'); 
$this->db->where('order.date',"1-1-11");    
$query = $this->db->get(); 

我得到的結果,

Pizza------ 10 
Burger------10 

我要的是,

Pizza-------10 
Burger------20 
Pepsi-------0 
+2

儘量讓你的第二個加入左連接。直接在SQL中,id嘗試使用coalesce(用某種東西替換空值)。例如coalesce(number of Burger,0)。如果伯爵數爲空,那麼youd在查詢結果中看到0 – Alex 2014-10-07 16:00:28

+0

@Alex:感謝您的幫助。我已經嘗試了第二次加入,但我仍然只得到1項。 – 2014-10-07 16:13:43

+0

如果我們一步一步做一次一次加入,你總會得到1個結果嗎? – Alex 2014-10-07 16:18:11

回答

1

如果改變了所有連接至左連接,可以隨時在兩個單獨的查詢中進行,並在兩者之間進行聯合。一個人會得到所有實際上有數量的線,另一個會得到剩下的,並把它們放在前面。

它看起來有點像這樣。可能會有一些synthax錯誤,但是你必須在php中重寫它:

p.s.要加總數量,你可以用sum()

Select itemmaster.name, orderdetails.quantity from itemmaster 
left join orderdetails on orderdetails.itemid = itemmaster.id 
left join order on order.orderid = orderdetails.orderid 
where order.date = '1-1-11' 
group by itemmaster.name 

Union 
Select itemmaster.name, '0' as quantity From itemmaster 
except (Select itemmaster.name, orderdetails.quantity from itemmaster 
left join orderdetails on orderdetails.itemid = itemmaster.id 
left join order on order.orderid = orderdetails.orderid 
where order.date = '1-1-11' 
group by itemmaster.name) 
group by itemmaster.name 

希望對你有所幫助!祝你好運