Codeigniter中的多重连接

11

我是数据库构建的新手,现在想要基于三个数据库表进行JOIN操作。

Table A = ID, Name, etc
Table B = ID, Name, etc
Table C = ID, TableAId, TableBId

我无法理解的是如何使用 Active Record 进行此选择。我想尽可能地减少请求,但在不进行三个单独调用的情况下应该如何编写。

4个回答

35
$this->db->select('*');
$this->db->from('TableA AS A');// I use aliasing make joins easier
$this->db->join('TableC AS C', 'A.ID = C.TableAId', 'INNER');
$this->db->join('TableB AS B', 'B.ID = C.TableBId', 'INNER');
$result = $this->db->get();

join函数的使用方法如下:

join('表名', '连接条件', '连接类型');

对应的SQL语句:

SELECT *
FROM TableA AS A
    INNER JOIN TableC AS C
    ON C.TableAId = A.ID
    INNER JOIN TableB AS B
    ON B.ID = C.ID

我发现先编写SQL语句、测试,然后再转换为Active Record风格可以减少错误。


这会产生重复的行。有什么解决办法吗? - JWC May
@JWCMay 它永远不会重复行,因为你有多个匹配项,这正是它的全部目的。如果你想要不同的数据,你应该重新设计你的数据库。 - Michael Ozeryansky

5
$this->db->select('*');
$this->db->from('blogs');
$this->db->join('comments', 'comments.id = blogs.id');
$this->db->join('authors', 'authors.id = comments.author_id');

希望您能理解我的例子。

只需添加另一个 $this->db->join()

对于复杂的查询,您最好查看像Doctrine这样的ORM。


1
$this->db->select('*');

$this->db->from('table1');

$this->db->join('table2','table1.id=table2.id'); 

$this->db->join('table3','table2.id=table3.id');

$this->db->join('table4','table3.id=table4.id'); 

$this->db->join('table5','table5.id=table4.id');

$this->db->where('table5.id',$this->session->userdata('id'));//getting value from session and match the id of table5 and then show data

$data=$this->db->get()->result();//all data store in $data variable

这个答案缺少教育性的解释。 - mickmackusa

0
如果您想要一个灵活的查询,可以使用以下代码:

http://codeigniter.com/user_guide/database/results.html

这段代码使用以下语法:$query = $this->db->query('SELECT * FROM my_table');

查询如下:

SELECT a.name as namea ,b.name as nameb FROM tablec c
JOIN tablea a ON a.ID = c.ID
JOIN tableb b ON b.ID = c.ID

你可能想要了解更多关于连接的知识,在这里

然后以这种方式浏览你的结果:

$query = $this->db->query("YOUR QUERY");

foreach ($query->result_array() as $row)
{
   echo $row['namea'];
   echo $row['nameb'];
}

2
使用查询命令只是解决问题的快速方法,这对他来说并没有解决任何问题。此外,由于CI不会转义个人数据,存在潜在的安全风险。 - Michael Ozeryansky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接