Codeigniter 4查询生成器联接2个或更多表,没有重复结果

问题描述

我已使用join并完成以下设置完成了查询构建器:

我的桌子

Table users

user_id | username | email          
1       | userA    | [email protected]
2       | userB    | [email protected]
                                    
                                    

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

我希望结果显示像这样:

  1. 一次显示用户名
  2. 一次显示添加到add_game表中的所有游戏
  3. 根据一次添加的游戏显示所有点火
  4. 一次显示添加到“团队”表中的所有团队

我完全不知道如何显示结果而不重复。另外,如果之后又有几张桌子,我该怎么办?

解决方法

如果执行正确的联接,您将获得期望的输出:

在描述之后,首先从表用户中选择,然后在表用户上加入add_game表,然后在add_game中加入游戏表,最后在add_game中再次加入表队。

查询如下:

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   [email protected]     1   1   ignA    accA    1   gameA   5   1   1
1   userA   [email protected]     1   1   ignA    accA    1   gameA   6   1   1
1   userA   [email protected]     2   1   ignB    accB    2   gameB   7   2   1
1   userA   [email protected]     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 .:我正在使用表别名t1,t2等。如果表名变得很长/具有描述性,这将派上用场。它不仅可以提高可视性,而且可以减少打字工作。

这很好地解释了JOIN的工作原理:A Visual Explanation of SQL Joins