帮助PHP MySQL加入

时间:2011-01-06 05:29:10

标签: php mysql codeigniter

请帮助我理解正确的连接语法。

我的表名为 inventory ,其中包含:

trans_id    
trans_items items -> item_id         
trans_user  employees -> person_id           
trans_date                   
trans_comment                
trans_inventory     

如上所示,trans_items是items表中的外键,trans_user是employees表中的外键,employee id是people表的外键。

现在我要做的是在HTML中显示库存表,但不是显示员工ID,而是希望显示员工NAME。


EDIT .............................................. .. 所以我只能使用以下代码显示员工的姓氏:

$this->db->select('inventory.*, items.name ,people.last_name');
$this->db->from('inventory');
$this->db->join('items', 'inventory.trans_items = items.item_id' , 'left');
$this->db->join('people', 'inventory.trans_user = people.person_id' , 'left');
$this->db->where('deleted', 0);
$this->db->order_by('trans_date desc');

使用型号代码:

foreach($report_data as $row)
        {
            $tabular_data[] = array($row['name'], $row['last_name'],$row['trans_date'], $row['trans_inventory'], $row['trans_comment']);
        }

但我需要它作为名字和姓氏,所以我做了这些:

$this->db->select('inventory.*, items.name ,CONCAT(people.first_name, " ",people.last_name) as employee');
$this->db->from('inventory');
$this->db->join('items', 'inventory.trans_items = items.item_id' , 'left');
$this->db->join('people', 'inventory.trans_user = people.person_id' , 'left');
$this->db->where('deleted', 0);
$this->db->order_by('trans_date desc');

使用型号代码:

foreach($report_data as $row)
        {
            $tabular_data[] = array($row['name'], $row['employee'],$row['trans_date'], $row['trans_inventory'], $row['trans_comment']);
        }

如果我使用concat函数会出错。请帮忙。

3 个答案:

答案 0 :(得分:1)

这应该对你有用

   $this->db->select('inventory.*, items.name ');
   $this->db->from('inventory');
   $this->db->join('items', 'inventory.item_id = items.item_id');
   $this->db->order_by('trans_date desc');

   return $this->db->get()->result_array();

答案 1 :(得分:0)

SELECT
    t.trans_id,
    i.item_name,
    t.trans_user,
    t.trans_date,
    t.trans_comment,
    t.trans_inventory
FROM
    trans as t
        LEFT JOIN
            items as i 
                ON
                    i.item_id = t.trans_items
LIMIT 0, 30;

在上述查询中会产生一些问题,例如项目名称为item_name,主表名称为trans等。

我在这里使用的是左连接。

在此示例中,使用左连接是最好的事情,因为它只从items表中选择一行。

有关联接的更多信息:MySQL :: MySQL 5.0 Reference Manual :: 12.2.8.1 JOIN Syntax

---更新。 PS:这是在您更新CodeIgniter之前发布的。而且我并不熟悉它。所以你可以删除这个答案或留在这里供其他人参考。

答案 2 :(得分:0)

以下将为您效劳。

$this->db->select('items.name , inventory.trans_user, inventory.trans_date, inventory.trans_inventory, inventory.trans_comment');
$this->db->from('inventory');
$this->db->join('items', 'inventory.item_id = items.item_id');
$this->db->order_by('inventory.trans_date desc');

return $this->db->get()->result_array();

编辑-------------------------

试试以下内容。它会有所帮助..

$this->db->select('inventory.*, items.name ,CONCAT(employees.first_name, " ",employees.last_name) as employee');
$this->db->from('inventory');
$this->db->join('items', 'inventory.trans_items = items.item_id' , 'left');
$this->db->join('employees', 'inventory.trans_user = employees.person_id' , 'left');
$this->db->join('people', 'employees.person_id = people.person_id' , 'left');
$this->db->where('deleted', 0);
$this->db->order_by('trans_date desc');

注意:我假设firstname和lastname属性是employees表的一部分。你可以把它改成它所属的表名。

谢谢!

侯赛因。