使用 WHERE 的多对多(PHP 和 MySQL)
Many-to-Many with WHERE (PHP and MySQL)
我有一个多对多 table,它的名字是 "users_groups"。有了这个 table,我想将唯一的 user_id 分配给 group_id。这工作得很好,但现在 我想制作一个面板,显示当前用户在哪些组中以及这些组中有哪些用户。
这是我当前获取所有组及其用户的代码。
MySQL-部分
$all_groups = mysqli_query
($db,
"SELECT group_name,GROUP_CONCAT(realname SEPARATOR ', ') AS users
FROM groups
JOIN users_groups ON groups.group_id=users_groups.group_id
JOIN users ON users_groups.user_id=users.user_id
GROUP BY group_name
"
);
PHP-部分
echo'
<table class="table_standard">
<tr>
<th class="th_titlebar">Group</th>
<th class="th_titlebar">Members</th>
</tr>';
while($row_all_groups = mysqli_fetch_array($all_groups)) {
echo '<tr>';
echo '<td class="td_contentbar">'.$row_all_groups["group_name"].'</td>';
echo '<td class="td_contentbar">'.$row_all_groups["users"].'</td>';
echo '</tr>';
}
echo '</table>';
现在我不知道如何在 MySQL 中包含 WHERE-Part。我已经用 WHERE users_groups.user_id = $session_user_id
试过了,但是用这种方法,组的成员列表只填满了当前用户。
我的下一个想法是制作第一个 MySQL-Request,例如 SELECT group_id FROM users_groups WHERE user_id=$user_id
,它保护数组中的 group_id,等等,但这对我不起作用,不知道为什么。
你想让它显示当前登录用户所在的用户组吗?
如果是这样,那么这将是您的 sql 基于以上内容:
SELECT group_name,GROUP_CONCAT(realname SEPARATOR ', ') AS users
FROM users
JOIN users_groups ON users_groups.user_id = users.user_id
JOIN groups ON groups.group_id = users_groups.group_id
WHERE users.user_id = $session_user_id
GROUP BY groups.group_id
那应该 return 所有组和当前用户的结果。要删除此重复用户,如果您只是显示当前用户分配到的当前组,然后从 select 中删除实名部分并只包含 group_name.
显示当前用户在哪些组以及这些组中有哪些用户。
当前用户所在的组:
SELECT g.group_name
FROM groups g
JOIN users_groups ug
ON ug.group_id = g.group_id
WHERE ug.user_id = :session_user_id
ORDER BY g.group_name
要获取 groups
中的用户列表,我们需要另一个加入 users_groups
table。我们还可以将连接添加到 users
table 以获取这些用户的信息...
-- og = other user_id that are in a a group
-- ou = info about those other users
SELECT g.group_name
, ou.user_id
, ou.realname
FROM groups g
JOIN users_groups ug
ON ug.group_id = g.group_id
JOIN users_groups og
ON og.group_id = g.group_id
JOIN users ou
ON ou.user_id = og.user_id
WHERE ug.user_id = :session_user_id
ORDER BY g.group_name, ou.user_id
如果要从用户列表中省略当前用户,可以添加不等式谓词。
如果您想将每个组折叠成一行,您可以使用 GROUP BY
子句和 GROUP_CONCAT
函数,就像在您的第一个查询中一样。要获得更确定的结果,请考虑在 GROUP_CONCAT 中添加一个 ORDER BY。请注意 group_concat_max_len
设置,它会限制返回字符串的大小。
您可以使用子 select 和联结 table 的附加连接来仅获取组 @session_user_id
具有关联,在 GROUP_CONCAT
部分获取所有成员来自结果组
SELECT g.group_name,GROUP_CONCAT(DISTINCT u.realname SEPARATOR ', ') AS users
FROM groups g
JOIN (SELECT * FROM users_groups WHERE user_id =@session_user_id) ug
ON g.group_id=ug.group_id
JOIN users_groups ug1 ON g.group_id=ug1.group_id
JOIN users u ON ug1.user_id=u.user_id
GROUP BY g.group_name
我有一个多对多 table,它的名字是 "users_groups"。有了这个 table,我想将唯一的 user_id 分配给 group_id。这工作得很好,但现在 我想制作一个面板,显示当前用户在哪些组中以及这些组中有哪些用户。
这是我当前获取所有组及其用户的代码。
MySQL-部分
$all_groups = mysqli_query
($db,
"SELECT group_name,GROUP_CONCAT(realname SEPARATOR ', ') AS users
FROM groups
JOIN users_groups ON groups.group_id=users_groups.group_id
JOIN users ON users_groups.user_id=users.user_id
GROUP BY group_name
"
);
PHP-部分
echo'
<table class="table_standard">
<tr>
<th class="th_titlebar">Group</th>
<th class="th_titlebar">Members</th>
</tr>';
while($row_all_groups = mysqli_fetch_array($all_groups)) {
echo '<tr>';
echo '<td class="td_contentbar">'.$row_all_groups["group_name"].'</td>';
echo '<td class="td_contentbar">'.$row_all_groups["users"].'</td>';
echo '</tr>';
}
echo '</table>';
现在我不知道如何在 MySQL 中包含 WHERE-Part。我已经用 WHERE users_groups.user_id = $session_user_id
试过了,但是用这种方法,组的成员列表只填满了当前用户。
我的下一个想法是制作第一个 MySQL-Request,例如 SELECT group_id FROM users_groups WHERE user_id=$user_id
,它保护数组中的 group_id,等等,但这对我不起作用,不知道为什么。
你想让它显示当前登录用户所在的用户组吗?
如果是这样,那么这将是您的 sql 基于以上内容:
SELECT group_name,GROUP_CONCAT(realname SEPARATOR ', ') AS users
FROM users
JOIN users_groups ON users_groups.user_id = users.user_id
JOIN groups ON groups.group_id = users_groups.group_id
WHERE users.user_id = $session_user_id
GROUP BY groups.group_id
那应该 return 所有组和当前用户的结果。要删除此重复用户,如果您只是显示当前用户分配到的当前组,然后从 select 中删除实名部分并只包含 group_name.
显示当前用户在哪些组以及这些组中有哪些用户。
当前用户所在的组:
SELECT g.group_name
FROM groups g
JOIN users_groups ug
ON ug.group_id = g.group_id
WHERE ug.user_id = :session_user_id
ORDER BY g.group_name
要获取 groups
中的用户列表,我们需要另一个加入 users_groups
table。我们还可以将连接添加到 users
table 以获取这些用户的信息...
-- og = other user_id that are in a a group
-- ou = info about those other users
SELECT g.group_name
, ou.user_id
, ou.realname
FROM groups g
JOIN users_groups ug
ON ug.group_id = g.group_id
JOIN users_groups og
ON og.group_id = g.group_id
JOIN users ou
ON ou.user_id = og.user_id
WHERE ug.user_id = :session_user_id
ORDER BY g.group_name, ou.user_id
如果要从用户列表中省略当前用户,可以添加不等式谓词。
如果您想将每个组折叠成一行,您可以使用 GROUP BY
子句和 GROUP_CONCAT
函数,就像在您的第一个查询中一样。要获得更确定的结果,请考虑在 GROUP_CONCAT 中添加一个 ORDER BY。请注意 group_concat_max_len
设置,它会限制返回字符串的大小。
您可以使用子 select 和联结 table 的附加连接来仅获取组 @session_user_id
具有关联,在 GROUP_CONCAT
部分获取所有成员来自结果组
SELECT g.group_name,GROUP_CONCAT(DISTINCT u.realname SEPARATOR ', ') AS users
FROM groups g
JOIN (SELECT * FROM users_groups WHERE user_id =@session_user_id) ug
ON g.group_id=ug.group_id
JOIN users_groups ug1 ON g.group_id=ug1.group_id
JOIN users u ON ug1.user_id=u.user_id
GROUP BY g.group_name