加入三个table codeigniter 4
Join three table codeigniter 4
大家好,我是 codeigniter 4 的新手,目前正在做项目中的一个小项目,我正在尝试加入三个 table 并在单个 table 中显示数据。
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 实际上是相同的 table。
接受您的尝试并更正它以使用 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"
}
}
请注意,您的查询中出现了两次名称。那么哪一个会赢呢? Table_2.name 似乎只被使用,任何对 Table_1.name 的引用都是 NULL,因为它没有被使用。
您可以使用别名给它们不同的名称,但这样您会得到类似 name_1 和 name_2 的名称,那么它是哪一个?这是由于您的 Table_1 和 Table_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 已重命名为作者。 (见下面的输出)
然后必须对 Table_1 和 Table_2 执行 UNION
,结果被命名(别名)为 T12(shorthand for Table_1和 Table_2),因为结果需要一个新名称。
然后对 Table_3 执行 LEFT JOIN
,这将给出所有存在 NULLS 的组合,因此 WHERE 语句在 [=50= 上使用“IS NOT NULL”过滤掉那些组合].
我省略了 ORDER BY
,因为它并不是真正需要的,如果您愿意,可以将其添加回去。
A 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、作者和标题,正如您使用示例表所请求的那样。
大家好,我是 codeigniter 4 的新手,目前正在做项目中的一个小项目,我正在尝试加入三个 table 并在单个 table 中显示数据。
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 实际上是相同的 table。
接受您的尝试并更正它以使用 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"
}
}
请注意,您的查询中出现了两次名称。那么哪一个会赢呢? Table_2.name 似乎只被使用,任何对 Table_1.name 的引用都是 NULL,因为它没有被使用。
您可以使用别名给它们不同的名称,但这样您会得到类似 name_1 和 name_2 的名称,那么它是哪一个?这是由于您的 Table_1 和 Table_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 已重命名为作者。 (见下面的输出)
然后必须对 Table_1 和 Table_2 执行 UNION
,结果被命名(别名)为 T12(shorthand for Table_1和 Table_2),因为结果需要一个新名称。
然后对 Table_3 执行 LEFT JOIN
,这将给出所有存在 NULLS 的组合,因此 WHERE 语句在 [=50= 上使用“IS NOT NULL”过滤掉那些组合].
我省略了 ORDER BY
,因为它并不是真正需要的,如果您愿意,可以将其添加回去。
A 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、作者和标题,正如您使用示例表所请求的那样。