-1

我有 3 张桌子:

module_names (module_id,module_name)

  • 1 | 测试模块
  • 2 | 测试模块2
  • 3 | 测试模块3

module_groups (group_id,group_name)

  • 1 | 团体
  • 2 | 组2
  • 3 | 组3
  • 4 | 第 4 组

modules_to_groups (module_id,group_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();
}
4

2 回答 2

2

你需要使用LEFT JOIN,因为你想列出所有module_groups

SELECT  a.Group_name,
        GROUP_CONCAT(c.Module_Name)
FROM    module_group a
        LEFT JOIN modules_to_groups b
            ON a.group_id = b.group_id
        LEFT JOIN module_names c
            ON b.module_ID = c.module_ID
GROUP   BY a.Group_name

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

于 2013-06-01T17:11:44.033 回答
1

首先,您的 SQL 中似乎有一个奇怪的条件 - g.group_id = g.group_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();
}

希望能帮助到你!

于 2013-06-01T17:26:51.700 回答