Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/244.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带WHERE的多对多(PHP和MySQL)_Php_Mysql_Many To Many_Where - Fatal编程技术网

带WHERE的多对多(PHP和MySQL)

带WHERE的多对多(PHP和MySQL),php,mysql,many-to-many,where,Php,Mysql,Many To Many,Where,我有一个多对多表,它以“users\u groups”命名。使用此表,我想将唯一的用户id分配给组id。这非常有效,但现在我想制作一个面板,显示当前用户所在的组以及这些组中的用户。 这是我当前用于获取所有组及其用户的代码 MySQL部分 $all_groups = mysqli_query ($db, "SELECT group_name,GROUP_CONCAT(realname SEPARATOR ', ') AS users

我有一个多对多表,它以“users\u groups”命名。使用此表,我想将唯一的用户id分配给组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
            "
            );
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>';
PHP部分

$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
            "
            );
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>';
echo'
团体
成员
';
while($row\u all\u groups=mysqli\u fetch\u array($all\u groups)){
回声';
回显“.$row_all_groups[“group_name”]”;
回显“”。$row_all_组[“用户”]”;
回声';
}
回声';
现在我不知道如何在MySQL中包含WHERE部分。我已经用
WHERE users\u groups.user\u id=$session\u user\u id
尝试过了,但是用这个方法组的成员列表中只填充了当前用户。
我的下一个想法是发出第一个MySQL请求,比如
从用户组中选择组id,其中用户id=$user\u id
可以保护组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

这将返回包含所有组和当前用户的结果。若要删除此重复用户,请仅显示分配给当前用户的当前组,然后从选择中删除realname部分,并仅使用组名称。

显示当前用户所在的组以及这些组中的用户。

当前用户所在的组:

  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
要获取那些
组中的用户列表
,我们需要另一个到
用户组
表的连接。我们还可以将连接添加到
users
表中,以获取这些用户的信息

  -- 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
如果要从用户列表中忽略当前用户,可以添加一个不等式谓词


如果要为每个组将其折叠为一行,可以使用
GROUPBY
子句和
group\u CONCAT
函数,就像在第一次查询中一样。对于一个更确定的结果,考虑在GROPPECONTAT中添加一个订单。请注意
group\u concat\u max\u len
设置,该设置会限制返回字符串的大小。

您可以为连接表使用子选择和附加联接,以仅获取组
@session\u user\u id
具有关联的组,并在
group\u 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

这项工作做得很好,但这些“g”和“u”是什么意思?@KlippOhei这些被称为