【问题标题】:Create JOIN for a many-to-many relationship为多对多关系创建 JOIN
【发布时间】:2020-09-10 05:19:52
【问题描述】:

我无法理解 JOIN 和多对多数据库关系。

我有 3 个表(结构已简化)

用户:

id (primary)    |    userEmail    |    userName    |    userAddress    |    userCreated

团队:

id (primary)    |    teamName    |    teamLogo    |    teamCreated

团队用户

id (primary)    |    userId    |    teamId    |   userLevel

团队可以有很多用户。并且用户可以在许多团队中。 UsersTeams 表跟踪哪些用户在哪些团队中(注意:我没有使用外键或任何东西)。

当用户登录时,我想获取他们所属的所有团队的列表以及相应的数据,即

  • 从 USERS 获取数据(其中 id = $id)
  • 在 TEAMS-USERS 中查找
  • 通过 TEAMS-USERS 中的 teamID 从 TEAMS 获取团队信息
  • 全部存储在一个数组中

到目前为止,我有这段代码,但老实说,我只是在尝试很多变体:

    $model->select('users.*, teams.*, teams.id as teamId, teams-users.id as teamsUsersId, teams-users.userId as teamsUsersUserId, teams-users.teamId as teamsUsersTeamId');
    $model->where("users.id", $id);
    $model->join('teams-users','teams.id = teams-users.teamId','inner');

    $data = $model->get()->getRowArray();

运行上面的查询给了我错误:Unknown table 'myproject.teams' - 即使 TEAMS 表 100% 存在并且我在整个项目中都使用它。

我哪里错了?

【问题讨论】:

  • 你加入同一个表两次......每个都需要自己的唯一别名,否则数据库无法区分它们......

标签: php sql codeigniter


【解决方案1】:

您收到此错误是因为在您的查询中您没有包含 from 子句并且您缺少 join 子句。使用 codeigniter,您可以这样做:

$model->select('users.*, teams.*, teams.id as teamId, teams-users.id as teamsUsersId, teams-users.userId as teamsUsersUserId, teams-users.teamId as teamsUsersTeamId');
//$model->where("users.id", $id);
$model->join('teams-users','teams.id = teams-users.teamId','left');
$model->join('users','user.id = teams-users.userId  and users.id='.$id,'left');
$data = $model->get('teams')->getRowArray();

解释:

  • 表用户缺少连接
  • 您想使用左连接
  • 将 where 子句放在对应的连接中(变成and
  • 您错过了 from 部分,可以将表名放入 get() 函数或$model->from('teams');

另见nice explanation of joins

【讨论】:

  • 谢谢@Vickel。我不得不从get() 中删除“团队”并添加一个 FROM 子句(团队),但它可以工作。有点。它应该返回 2 行。但是,它返回 5(刚刚重复的 2 个匹配项)。5 也是数字我的参考表 teams-users 中的行数。为什么会发生这种情况?
  • 实际上,不,它只是列出了 team-users 表中的所有行。 where 语句被忽略
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多