2014-10-07 2 views
2

У меня есть 3 таблицы,левой присоединиться к CodeIgniter

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 (numberofBurger, 0). Если numberofBurger имеет значение null, вы увидите 0 в результатах запроса – Alex

+0

@Alex: Спасибо за вашу помощь. Я попытался сделать второе соединение слева, но все же я получаю только 1 элемент. –

+0

, если мы шаг за шагом подойдем и сделаем одно соединение, вы всегда получаете только 1 результат? – Alex

ответ

1

Если изменяя все присоединяется к левой присоединяется, вы всегда можете делайте это в двух отдельных запросах и делайте соединение между ними. Можно было бы получить все линии, которые имеют фактическое количество, а другое - получить остатки и поместить их в пул.

Это будет выглядеть примерно так. может возникнуть некоторая ошибка synthax, но вам все равно придется переписывать ее на php:

p.s. чтобы добавить количество, вы можете использовать сумму()

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 

надеюсь, что это поможет! удачи

Смежные вопросы