Codeigniter 4 查询生成器加入 2 个或更多表而没有重复结果
Codeigniter 4 query builder join 2 or more tables without duplicate result
我已经通过以下设置使用连接完成了一个查询构建器:
我的表格
Table users
user_id | username | email
1 | userA | userA@email.com
2 | userB | userB@gmail.com
Table teams
team_id | game_id | leader_user_id
5 | 1 | 1
6 | 1 | 1
7 | 2 | 1
8 | 2 | 1
Table games
game_id | game_name
1 | gameA
2 | gameB
3 | gameC
Table add_game
game_id | user_id | ign | acc_id
1 | 1 | ignA | accA
2 | 1 | ignB | accB
3 | 1 | ignC | accC
这是我当前的代码:
控制器
public function profile()
{
$data = [];
$db = db_connect();
$model = new ProfileModel($db);
$data['profile'] = $model->getProfile();
echo view('templates/header', $data);
echo view('account/profile', $data);
echo view('templates/footer', $data);
}
}
型号:
return $this->db->table('users')
->join('add_game', 'add_game.user_id = users.user_id')
->join('teams', 'teams.leader_user_id = users.user_id')
->join('games', 'games.game_id = add_game.game_id')
->where('users.user_id', $user_id)
//->groupBy('users.user_id')
//->distinct('users.user_id')
//->select(("GROUP_CONCAT(game_id, ign, acc_id) AS userdata"))
->get()
->getResultArray();
查看
<?php
$my_id = 0;
foreach($profile as $row){
if($my_id != $row['user_id']){
?>
<div><?=$row['username']?></div> <!--data from table user-->
<div><?=$row['game_name']?></div> <!--data from table add_game-->
<div><?=$row['ign']?></div>
<div><?=$row['acc_id']?></div>
<div><?=$row['team_id']?></div>
<?php
} else {
?>
<div><?=$row['game_name']?></div>
<div><?=$row['ign']?></div> <!--only data from table add_game-->
<div><?=$row['acc_id']?></div>
<div><?=$row['team_id']?></div>
<?php
}
$my_id = $row['user_id'];
}
?>
现在我收到很多奇怪的重复数据:
userA
gameA
ignA
accA
5
gameB
ignB
accB
5
gameC
ignC
accC
5
gameA
ignA
accA
6
gameB
ignB
accB
6
gameC
ignC
accC
6
gameA
ignA
accA
7
gameB
ignB
accB
7
gameC
ignC
accC
7
gameA
ignA
accA
8
gamneB
ignB
accB
8
gameC
ignC
accC
8
我希望结果显示如下:
- 显示一次用户名
- 显示所有已添加到add_game table的游戏一次
- 根据添加一次的游戏显示所有标志
- 显示所有加入队伍table一次
我完全不知道如何在不重复的情况下显示我的结果。另外,如果我之后还有几个table,我需要做什么或怎么办?
如果您执行正确的连接,您将得到您期望的输出:
根据您的描述,您首先从 table 个用户中进行选择,然后加入 add_game table,然后在 add_game 加入游戏 table ] 最后你在 add_game.
再次加入 table 团队
查询看起来像:
SELECT *
from users t1
join add_game t2
on t2.user_id = t1.user_id
join games t3
on t3.game_id=t2.game_id
join teams t4
on t4.game_id=t2.game_id
where t1.user_id=1
在此 sqlfiddle
中查看实际效果
结果是:
user_id username email game_id user_id ign acc_id game_id game_name team_id game_id leader_user_id
1 userA userA@email.com 1 1 ignA accA 1 gameA 5 1 1
1 userA userA@email.com 1 1 ignA accA 1 gameA 6 1 1
1 userA userA@email.com 2 1 ignB accB 2 gameB 7 2 1
1 userA userA@email.com 2 1 ignB accB 2 gameB 8 2 1
可以使用 Codeigniter 构建此查询:
$user_id=1;
$this->db->table('users t1')
->join('add_game t2', 't2.user_id = t1.user_id')
->join('games t3', 't3.game_id = t2.game_id')
->join('teams t4', 't4.game_id= t2.game_id')
->where('t1.user_id', $user_id)
P.S.: 我正在使用 table 别名 t1、t2 等...,如果 table 名称变得相当 long/descriptive,这会派上用场。它不仅可以提高可见度,还可以减少 type-work.
这里很好地解释了 JOIN 的工作原理:A Visual Explanation of SQL Joins
我已经通过以下设置使用连接完成了一个查询构建器:
我的表格
Table users
user_id | username | email
1 | userA | userA@email.com
2 | userB | userB@gmail.com
Table teams
team_id | game_id | leader_user_id
5 | 1 | 1
6 | 1 | 1
7 | 2 | 1
8 | 2 | 1
Table games
game_id | game_name
1 | gameA
2 | gameB
3 | gameC
Table add_game
game_id | user_id | ign | acc_id
1 | 1 | ignA | accA
2 | 1 | ignB | accB
3 | 1 | ignC | accC
这是我当前的代码:
控制器
public function profile()
{
$data = [];
$db = db_connect();
$model = new ProfileModel($db);
$data['profile'] = $model->getProfile();
echo view('templates/header', $data);
echo view('account/profile', $data);
echo view('templates/footer', $data);
}
}
型号:
return $this->db->table('users')
->join('add_game', 'add_game.user_id = users.user_id')
->join('teams', 'teams.leader_user_id = users.user_id')
->join('games', 'games.game_id = add_game.game_id')
->where('users.user_id', $user_id)
//->groupBy('users.user_id')
//->distinct('users.user_id')
//->select(("GROUP_CONCAT(game_id, ign, acc_id) AS userdata"))
->get()
->getResultArray();
查看
<?php
$my_id = 0;
foreach($profile as $row){
if($my_id != $row['user_id']){
?>
<div><?=$row['username']?></div> <!--data from table user-->
<div><?=$row['game_name']?></div> <!--data from table add_game-->
<div><?=$row['ign']?></div>
<div><?=$row['acc_id']?></div>
<div><?=$row['team_id']?></div>
<?php
} else {
?>
<div><?=$row['game_name']?></div>
<div><?=$row['ign']?></div> <!--only data from table add_game-->
<div><?=$row['acc_id']?></div>
<div><?=$row['team_id']?></div>
<?php
}
$my_id = $row['user_id'];
}
?>
现在我收到很多奇怪的重复数据:
userA
gameA
ignA
accA
5
gameB
ignB
accB
5
gameC
ignC
accC
5
gameA
ignA
accA
6
gameB
ignB
accB
6
gameC
ignC
accC
6
gameA
ignA
accA
7
gameB
ignB
accB
7
gameC
ignC
accC
7
gameA
ignA
accA
8
gamneB
ignB
accB
8
gameC
ignC
accC
8
我希望结果显示如下:
- 显示一次用户名
- 显示所有已添加到add_game table的游戏一次
- 根据添加一次的游戏显示所有标志
- 显示所有加入队伍table一次
我完全不知道如何在不重复的情况下显示我的结果。另外,如果我之后还有几个table,我需要做什么或怎么办?
如果您执行正确的连接,您将得到您期望的输出:
根据您的描述,您首先从 table 个用户中进行选择,然后加入 add_game table,然后在 add_game 加入游戏 table ] 最后你在 add_game.
再次加入 table 团队查询看起来像:
SELECT *
from users t1
join add_game t2
on t2.user_id = t1.user_id
join games t3
on t3.game_id=t2.game_id
join teams t4
on t4.game_id=t2.game_id
where t1.user_id=1
在此 sqlfiddle
中查看实际效果结果是:
user_id username email game_id user_id ign acc_id game_id game_name team_id game_id leader_user_id
1 userA userA@email.com 1 1 ignA accA 1 gameA 5 1 1
1 userA userA@email.com 1 1 ignA accA 1 gameA 6 1 1
1 userA userA@email.com 2 1 ignB accB 2 gameB 7 2 1
1 userA userA@email.com 2 1 ignB accB 2 gameB 8 2 1
可以使用 Codeigniter 构建此查询:
$user_id=1;
$this->db->table('users t1')
->join('add_game t2', 't2.user_id = t1.user_id')
->join('games t3', 't3.game_id = t2.game_id')
->join('teams t4', 't4.game_id= t2.game_id')
->where('t1.user_id', $user_id)
P.S.: 我正在使用 table 别名 t1、t2 等...,如果 table 名称变得相当 long/descriptive,这会派上用场。它不仅可以提高可见度,还可以减少 type-work.
这里很好地解释了 JOIN 的工作原理:A Visual Explanation of SQL Joins