【问题标题】:Left join in codeigniter左加入codeigniter
【发布时间】:2014-10-07 15:53:33
【问题描述】:

我有 3 张桌子,

 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

【问题讨论】:

  • 尝试将您的第二个加入也设为左加入。直接在 SQL 中, id 尝试使用 coalesce (用某物替换空值)。例如 coalesce(numberofBurger,0)。如果 numberofBurger 为 null,您会在查询结果中看到 0
  • @Alex:感谢您的帮助。我尝试了第二次加入,但我仍然只得到 1 项。
  • 如果我们一步一步地一次加入一个,你总是只得到一个结果吗?
  • 如果只有一个连接(第一个)并且没有 where 语句,我会按预期获得多个项目。
  • 我猜只有第二个左连接只会返回 1 个结果?这有点奇怪。我没有任何方法可以在我的计算机 atm 上进行测试。 :/您的查询或表声明中是否有错误?因为它是写 itemmaster.itemid 而表只有一个列名 id

标签: php mysql sql codeigniter


【解决方案1】:

如果将所有联接更改为左联接,您始终可以在两个单独的查询中执行此操作,并在两者之间进行联合。一个会得到所有实际上有数量的行,另一个会得到其余的并将它们放在一起。

看起来有点像这样。可能有一些语法错误,但无论如何你都必须用 php 重写它:

附言将数量相加,您可以使用 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

希望这会有所帮助!祝你好运

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-14
    • 2010-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-06
    相关资源
    最近更新 更多