与WHERE(PHP和MySQL)的多对多

时间:2015-06-25 20:22:19

标签: php mysql many-to-many where

我有一个以" users_groups"命名的多对多表。使用此表,我想将唯一的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尝试了它,但是使用这种方法,组的成员列表只是填充了当前用户。 我的下一个想法是创建一个像SELECT group_id FROM users_groups WHERE user_id=$user_id这样的第一个MySQL-Request来保护数组中的group_id等,但这对我不起作用,不知道为什么。

3 个答案:

答案 0 :(得分:0)

您是否试图让它显示当前登录用户所在的用户组?

如果是这样,那么这将是基于以上内容的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

这应该返回所有组和当前用户的结果。要删除此重复用户,如果您只是显示当前用户的当前用户,则从select中删除realname部分,只需拥有group_name。

答案 1 :(得分:0)

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

当前用户所在的群组:

  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表。我们还可以将连接添加到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

如果要从用户列表中省略当前用户,可以添加不等式谓词。

如果要将每个组折叠为一行,可以使用GROUP BY子句和GROUP_CONCAT函数,就像在第一个查询中一样。要获得更确定的结果,请考虑在GROUP_CONCAT中添加ORDER BY。请注意group_concat_max_len设置,该设置限制了返回的字符串的大小。

答案 2 :(得分:0)

您可以为联结表使用子选择和其他联接,以便只有@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

DEMO