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
列,但这是我写这篇文章时的错误。我重写了你的代码一点,它工作得很好。谢谢!:)