加入三表代码点火器4



大家好,我是codeigniter 4的新手,目前正在该项目中的一个小项目中工作,我正在尝试连接三个表,并在单个表中显示数据。

Table_1
id unique_id Name
1  1111      Sam   
2  2222      Charlote
Table_2
id unique_id Name
1  1212      Jhon 
2  5151      Alex
Table_3
id author title
1  1111   Book_1
2  5151   Book_2
3  1111   Book_3

Result
------------------------
| No | Author | Title  |
------------------------
| 1  | Sam    | Book_1 |
| 2  | Alex   | Book_2 |
| 3  | Sam    | Book_3 |
------------------------

我试着加入,但没有工作。

$this->join('Table_1', 'Table_1.unique_id = Table_3.author ');
$this->join('Table_2', 'Table_2.unique_id = Table_3.author ');
$this->select('Table_1.Name');
$this->select('Table_2.Name');
$this->select('Table_3.*');
$this->orderBy('Table_3.id');
return  $this->findAll();

还有其他方法可以加入他们吗?谢谢

由于Table_1和Table_2实际上是同一个表,所以您当前拥有的内容无法使用。

尝试并更正为使用LEFT JOIN

public function example_1() {
$this->join('Table_1', 'Table_1.unique_id = Table_3.author', 'LEFT');
$this->join('Table_2', 'Table_2.unique_id = Table_3.author', 'LEFT');
$this->select('Table_1.Name');
$this->select('Table_2.Name');
$this->select('Table_3.*');
$this->orderBy('Table_3.id');
$result = $this->findAll();
echo $this->db->getLastQuery();
return $result;
}

你会得到。。。

SELECT `Table_1`.`Name`, `Table_2`.`Name`, `Table_3`.*
FROM `Table_3`
LEFT JOIN `Table_1` ON `Table_1`.`unique_id` = `Table_3`.`author`
LEFT JOIN `Table_2` ON `Table_2`.`unique_id` = `Table_3`.`author`
ORDER BY `Table_3`.`id`
array(3) {
[0]=>
array(4) {
["Name"]=>
NULL
["id"]=>
string(1) "1"
["author"]=>
string(4) "1111"
["title"]=>
string(6) "Book_1"
}
[1]=>
array(4) {
["Name"]=>
string(4) "Alex"
["id"]=>
string(1) "2"
["author"]=>
string(4) "5151"
["title"]=>
string(6) "Book_2"
}
[2]=>
array(4) {
["Name"]=>
NULL
["id"]=>
string(1) "3"
["author"]=>
string(4) "1111"
["title"]=>
string(6) "Book_3"
}
}

请注意,您的查询中出现了两个name。那么,哪一个会赢呢?似乎只使用了Table_2.name,对Table_1.name的任何引用都是NULL,因为它没有使用。

你可以用别名给他们起不同的名字,但你会有像name_1和name_2这样的名字,那是哪一个?这是由于您的表_1和表_2中存在重复,并且您要求两者都有。

更好的方法因此,在这种情况下,您需要对Table_1和Table_2执行UNION。

我认为CI查询生成器中没有UNION命令。

使用mysql,它将是…

public function get_book_and_author() {
$sql = "SELECT Table_3.id, T12.name as author, Table_3.title 
FROM (
SELECT Table_1.* FROM Table_1
UNION
SELECT Table_2.* FROM Table_2
) as T12
LEFT JOIN Table_3 ON T12.unique_id = Table_3.author  
WHERE Table_3.author IS NOT NULL
";
$result = $this->db->query($sql);
return $result->getResultArray();
}

因此,在本例中,我们在Select中指定了您需要的3个字段。请注意,T12.name已重命名为author。(见下文输出(

然后必须对Table_1和Table_2执行UNION,并且结果被命名(别名(为T12(Table_1和Table_2的简写(,因为结果需要新名称。

然后对Table_3执行LEFT JOIN,这将给出将存在NULLS的所有组合,因此where语句使用";IS NOT NULL";见表_3.author.

我遗漏了ORDER BY,因为它不是真正需要的,如果你愿意,你可以把它加回来。

结果的var_dump((给出。。。

array(3) {
[0]=>
array(3) {
["id"]=>
string(1) "1"
["author"]=>
string(3) "Sam"
["title"]=>
string(6) "Book_1"
}
[1]=>
array(3) {
["id"]=>
string(1) "2"
["author"]=>
string(4) "Alex"
["title"]=>
string(6) "Book_2"
}
[2]=>
array(3) {
["id"]=>
string(1) "3"
["author"]=>
string(3) "Sam"
["title"]=>
string(6) "Book_3"
}
}

因此,这将为您提供每个匹配行的id、作者和标题,正如您使用示例表所请求的那样。

相关内容

  • 没有找到相关文章

最新更新