多对多没有结果

时间:2015-06-27 14:21:53

标签: php mysql join many-to-many

起初,我的多对多关系与下表有关:

+----------+      +--------------+     
| users    |      | users_groups |     +--------------+
+----------+      +--------------+     | groups       |
| user_id  |----->| user_id      |     +--------------+
| username |      | group_id     |<----| group_id     |
| realname |      +--------------+     | group_name   |
| password |                           | group_desc   |
+----------+                           +--------------+

现在我想获得所有现有组的列表/表(不是数据库中的表!)以及特定组的所有用户,如下所示:

+---------------+--------------------------+
| group         | members                  |
+---------------+--------------------------+
| Group1        | User1, User2, User3      |
| Group2        | User3, User4, User6      |
| Group3        |                          |
+---------------+--------------------------+

我目前的MySQL代码是:

$all_groups = mysqli_query
            ($db,
            "
            SELECT g.group_name,GROUP_CONCAT(DISTINCT u.realname SEPARATOR ', ') AS users
            FROM groups g
            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
            "
            );

我目前的PHP代码是:

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>';
}

但问题是如果一个群组没有用户(在users_groups-table中),该群组没有显示在我有的列表/表格中,我不知道如何解决此

JOIN users_groups替换LEFT JOIN users_groups无效。

2 个答案:

答案 0 :(得分:0)

您只需要一个left join

SELECT g.group_name,
       GROUP_CONCAT(DISTINCT u.realname SEPARATOR ', ') AS users
FROM groups g LEFT JOIN
     users_groups ug1
     ON g.group_id = ug1.group_id LEFT JOIN
     users u ON ug1.user_id = u.user_id
GROUP BY g.group_name;

使用LEFT JOIN时,通常会将表格包含您想要保留的行。然后使用LEFT JOIN进行所有后续连接。

此外,您的数据可能在组中没有重复的用户名。 DISTINCT关键字会影响性能,只应在需要时使用。

答案 1 :(得分:0)

我不是用PHP编程,但我可以给你另一种方法来解决这个问题。 (用C#逻辑写)

首先提供一个表格,将所有群组与用户联系起来(使用左联合带来甚至没有用户的群组)

        SELECT g.group_name, u.realname AS users
        FROM groups g
        LEFT JOIN users_groups ug1 ON g.group_id=ug1.group_id
        JOIN users u ON ug1.user_id=u.user_id

然后在PHP中做这样的事情

$TEMP_VAR_LAST_GROUP = "NOGROUPNAMEATALL";
$I_HAVE_DATA = "FALSE";
while($row_all_groups = mysqli_fetch_array($all_groups)) {

   $I_HAVE_DATA = "TRUE";

   if($TEMP_VAR_LAST_GROUP != "NOGROUPNAMEATALL")
   {
       // This is just to close the tags after the last loop
       echo '</td></tr>'
   }


   If ($TEMP_VAR_LAST_GROUP == $row_all_groups["group_name"])
   {
      // this is a new group
      echo '<tr>';
      echo '<td class="td_contentbar">'.$row_all_groups["group_name"].'</td>';
      echo '<td class="td_contentbar">'.$row_all_groups["users"].'
   }
   else
   {
      // this is the same group, but new user
      echo ','.$row_all_groups["users"].'
   }

   // SETS A NEW LASST GROUP VAR
   $TEMP_VAR_LAST_GROUP == $row_all_groups["group_name"])

}

// This will close the last tags if the table has data
if($I_HAVE_DATA = "TRUE")
{
   echo '</td></tr>'
}