php-mysql和GROUP_-CONCAT

php-mysql和GROUP_-CONCAT,php,mysql,sql,Php,Mysql,Sql,我有三张桌子: 模块名称模块id,模块名称 1 |测试模块 2 |测试模块2 3 |测试模块3 模块组组组id、组名称 1 |组 2 |组2 3 |组3 4 |组4 模块到组模块id,组id 2|2 1|2 3|4 当我在查询中使用GROUP_CONCAT时,我得到了正确的结果 group2 -> test_module , test_module2 group4 -> test_module3 但我想: group1 -> (no module added yet) gro

我有三张桌子:

模块名称模块id,模块名称

1 |测试模块 2 |测试模块2 3 |测试模块3 模块组组组id、组名称

1 |组 2 |组2 3 |组3 4 |组4 模块到组模块id,组id

2|2 1|2 3|4 当我在查询中使用GROUP_CONCAT时,我得到了正确的结果

group2 -> test_module , test_module2
group4 -> test_module3
但我想:

group1 -> (no module added yet)
group2 -> test_module , test_module2
group3 -> (no module added yet)
group4 -> test_module3
我使用的整个功能:

function ListModuleGroups() {
global $admin,$prefix, $db, $admin_file;
OpenTable();
echo '<div><b>Groups and Modules :</b></div>';
$result = $db->sql_query("SELECT m.module_id, m.module_name, g.group_name, g.group_id, GROUP_CONCAT(m.module_name) from " . $prefix . "_mmmodule_groups g, " . $prefix . "_mmmodule_names m, " . $prefix . "_mmmodule_to_group m2g where m.module_id = m2g.module_id and m2g.group_id = g.group_id and g.group_id = g.group_id group by g.group_id");
while($row = $db->sql_fetchrow($result)) {
        $group_name = $row['group_name'];
        $module_name = $row['GROUP_CONCAT(m.module_name)'];

        echo "<div>".htmlentities($group_name). '--' . htmlentities($module_name)." </div>";
    }
CloseTable();
}
您需要使用LEFT JOIN,因为您要列出所有模块组

要进一步了解加入的更多信息,请访问以下链接:


首先,您的SQL-g.group\u id=g.group\u id中似乎有一个奇怪的条件。也许您可以尝试删除它

其次,您应该使用LEFT JOIN来读取所有组。LEFT JOIN从左侧的表中选择所有记录,从右侧的表中仅选择匹配的记录。请参考MySQL文档以进一步阅读

以下代码可能有助于获得所需的结果:

function ListModuleGroups() {
    global $admin,$prefix, $db, $admin_file;
    OpenTable();
    echo '<div><b>Groups and Modules :</b></div>';

    $result = $db->sql_query("SELECT g.group_name, GROUP_CONCAT(m.module_name) modules
    from " . $prefix . "_mmmodule_groups g
        LEFT JOIN " . $prefix . "_mmmodule_to_group m2g ON g.group_id = m2g.group_id 
        LEFT JOIN " . $prefix . "_mmmodule_names m ON m2g.module_id = m.module_id
    GROUP BY g.group_id");

    while($row = $db->sql_fetchrow($result)) {
            $group_name = $row['group_name'];
            if (!empty($row['modules'])) {
                $module_name = $row['modules'];
            } else {
                $module_name = '(no module added yet)';
            }
            echo "<div>".htmlentities($group_name). '--' . htmlentities($module_name)." </div>";
        }
    CloseTable();
}

希望有帮助

谢谢你,我接受了你的答案,因为你注意到了剩下的group\u id=group\u id,你把完整的函数写了一遍+1.我当然不得不投票支持将我指向SQLFiddle,并向我展示一个工作示例。我也非常感谢您。很高兴知道您也可以使用SQLFiddle+1。
function ListModuleGroups() {
    global $admin,$prefix, $db, $admin_file;
    OpenTable();
    echo '<div><b>Groups and Modules :</b></div>';

    $result = $db->sql_query("SELECT g.group_name, GROUP_CONCAT(m.module_name) modules
    from " . $prefix . "_mmmodule_groups g
        LEFT JOIN " . $prefix . "_mmmodule_to_group m2g ON g.group_id = m2g.group_id 
        LEFT JOIN " . $prefix . "_mmmodule_names m ON m2g.module_id = m.module_id
    GROUP BY g.group_id");

    while($row = $db->sql_fetchrow($result)) {
            $group_name = $row['group_name'];
            if (!empty($row['modules'])) {
                $module_name = $row['modules'];
            } else {
                $module_name = '(no module added yet)';
            }
            echo "<div>".htmlentities($group_name). '--' . htmlentities($module_name)." </div>";
        }
    CloseTable();
}