2014-10-07 138 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 

希望对你有所帮助!祝你好运