Mysql 具有多个表的多个条件的多个联接

Mysql 具有多个表的多个条件的多个联接,mysql,Mysql,首先我的桌子: game +----+--------------+ | id | game | +----+--------------+ | 1 | Game1 | | 2 | Game2 | | 4 | Game4 | +----+--------------+ group_game +---------+----------+ | game_id | group_id | +---------+----------+ |

首先我的桌子:

game
+----+--------------+
| id | game         |
+----+--------------+
|  1 | Game1        |
|  2 | Game2        |
|  4 | Game4        |
+----+--------------+

group_game
+---------+----------+
| game_id | group_id |
+---------+----------+
|       1 | 33       |
|       1 | 45       |
|       4 | 33       |
+---------+----------+

groups
+----+------------+----
| id | group_name | ...
+----+------------+----
| 33 | Group33    | ...
| 45 | Group45    | ...
+----+------------+----

users
+---------+----------+----
| user_id | username | ...
+---------+----------+----
|       1 | User1    | ...
|       2 | User2    | ...
+---------+----------+----

users_groups
+---------+----------+
| user_id | group_id |
+---------+----------+
|       1 | 33       |
|       1 | 45       |
|       2 | 45       |
+---------+----------+
我想做什么

现在,我想检查当前用户是否在玩“Game4”的组中,如果是,则输出应该是组的id和名称

  • 当前用户是ID为1的“User1”(表
    users
  • “User1”位于ID为33的组中(表
    users\u groups
  • 组ID 33属于“组33”(表
  • ID为33的组玩ID为4的游戏(表
    Group\u Game
  • ID为的游戏属于游戏“Game4”(表
    Game
  • 结论:是的,用户在一个玩Game4的组中,因此输出组名(“Group33”)
我当前的代码(没有行)


我不知道该如何构建这个查询:/

在连接生成数据集后,将应用where子句,从而否定连接的左连接方面。要解决此问题,请将条件移动到联接本身,以便在联接之前应用限制。否则,左连接中生成的空值将被where子句排除

可能还有其他元素,这只是我看到的第一个组件

$user_id = $_SESSION["user_id"];
$Game4= "Game4";

$gruppen_dayz = $db->prepare("
    SELECT g.group_id, g.group_name
    FROM groups g 
    LEFT JOIN users_groups ug
        ON g.group_id = ug.group_id
        AND ug.user_id = ?
    LEFT JOIN group_game gg
        ON g.group_id = gg.group_id
    LEFT JOIN game ga
        ON ga.id = gg.game_id
       AND ga.game = ? 
");
$gruppen_dayz->bind_param('ii', $Game4, $user_id);
---更新---- 经进一步调查,我相信你的加入是错误的。根据表结构,组没有组ID字段。现在走过剩下的

SELECT g.group_id, g.group_name
FROM groups g 
LEFT JOIN users_groups ug
    ON g.id = ug.group_id
LEFT JOIN group_game gg
    ON g.id = gg.group_id
LEFT JOIN game ga
    ON ga.id = gg.game_id
WHERE ga.game = ? AND ug.user_id = ?
我可以把它改写成

SELECT G.Id, G.Group_name
FROM USERS_GROUPS UG
INNER JOIN GROUPS G
 on UG.Group_ID = G.ID
INNER JOIN GROUP_GAME GG
 on GG.Group_ID = G.ID
INNER JOIN Game GA
 on GA.ID = GG.Game_ID
WHERE ga.game = ? AND ug.user_id = ?

根据您的条件,我看不出左连接有任何价值或需要。

在连接生成数据集后,将应用where子句,从而否定连接的左连接方面。要解决此问题,请将条件移动到联接本身,以便在联接之前应用限制。否则,左连接中生成的空值将被where子句排除

可能还有其他元素,这只是我看到的第一个组件

$user_id = $_SESSION["user_id"];
$Game4= "Game4";

$gruppen_dayz = $db->prepare("
    SELECT g.group_id, g.group_name
    FROM groups g 
    LEFT JOIN users_groups ug
        ON g.group_id = ug.group_id
        AND ug.user_id = ?
    LEFT JOIN group_game gg
        ON g.group_id = gg.group_id
    LEFT JOIN game ga
        ON ga.id = gg.game_id
       AND ga.game = ? 
");
$gruppen_dayz->bind_param('ii', $Game4, $user_id);
---更新---- 经进一步调查,我相信你的加入是错误的。根据表结构,组没有组ID字段。现在走过剩下的

SELECT g.group_id, g.group_name
FROM groups g 
LEFT JOIN users_groups ug
    ON g.id = ug.group_id
LEFT JOIN group_game gg
    ON g.id = gg.group_id
LEFT JOIN game ga
    ON ga.id = gg.game_id
WHERE ga.game = ? AND ug.user_id = ?
我可以把它改写成

SELECT G.Id, G.Group_name
FROM USERS_GROUPS UG
INNER JOIN GROUPS G
 on UG.Group_ID = G.ID
INNER JOIN GROUP_GAME GG
 on GG.Group_ID = G.ID
INNER JOIN Game GA
 on GA.ID = GG.Game_ID
WHERE ga.game = ? AND ug.user_id = ?

根据你的标准,我看不出左联接有什么价值,也不需要左联接。

groups
有一个
groupid
-列,但这是我写这篇文章时的错误。我重写了你的代码一点,它工作得很好。谢谢!:)表
groups
有一个
groupid
列,但这是我写这篇文章时的错误。我重写了你的代码一点,它工作得很好。谢谢!:)