0

情况

由于使用每个实体的各种情况,我有一个大量使用连接的数据库。这是一个简化的图表:

MySQL图

目标

无论是否设置了 user_has_module 中的“fk_chapter_id”,我都希望能够获取所有模块和“名称”字段的详细信息。

  • 在“user_has_module.fk_chapter_id”为空的情况下,系统可以返回模块的详细信息,然后返回空章。
  • 在有 user_has_module 的情况下,我想获取状态

问题

每当我执行 SQL 语句时,我只得到部分返回的结果。IE 如果我总共有 4 个模块记录,其中两个用户在“user_has_module”中有一个条目会完整返回这两个记录,然后是其他模块的 2 个空记录。

根据反馈更新,差不多了

现在,唯一的问题是我得到了重复。使用一些测试数据

SELECT DISTINCT
    chapter_id,
    chapter_name,
    module_id,
    module_name,
(null ) AS user_module_progress,
    (SELECT COUNT(fk_chapter_id) FROM module_has_chapter WHERE fk_module_id = m.module_id) AS chapter_count
FROM
    module as m
        LEFT  JOIN
    module_has_chapter as mhc ON m.module_id = mhc.fk_module_id
        LEFT JOIN
    chapter as c ON mhc.fk_chapter_id = c.chapter_id
    group by m.module_id

    UNION

SELECT DISTINCT
    chapter_id,
    chapter_name,
    module_id,
    module_name,
    user_module_progress,
(SELECT COUNT(fk_chapter_id) FROM module_has_chapter WHERE fk_module_id = m.module_id) AS chapter_count
FROM
module as m
LEFT JOIN
    user_has_module as uhm ON m.module_id = uhm.fk_module_id
LEFT JOIN
user as u ON uhm.fk_user_id = u.user_id
LEFT JOIN
    chapter as c ON uhm.fk_latest_chapter_id = c.chapter_id
WHERE u.user_id = 2
group by m.module_id;

结果

4

1 回答 1

0

我最终到达了那里,但对此并不特别高兴。这行得通,但是,这真是一团糟……请问有人有更好的解决方案吗?

SELECT DISTINCT
    (null) AS chapter_id,
    (null) AS chapter_name,
    module_id,
    module_name,
    (null ) AS user_module_progress,
    (SELECT COUNT(fk_chapter_id) FROM module_has_chapter WHERE fk_module_id = m.module_id) AS chapter_count
FROM
    module as m
LEFT JOIN 
     user_has_module as uhm ON m.module_id = uhm.fk_module_id
WHERE
    uhm.fk_user_id IS NULL

UNION ALL

SELECT DISTINCT
    chapter_id,
    chapter_name,
    module_id,
    module_name,
    user_module_progress,
    (SELECT COUNT(fk_chapter_id) FROM module_has_chapter WHERE fk_module_id = m.module_id) AS chapter_count
FROM
    module as m
LEFT JOIN
    user_has_module as uhm ON m.module_id = uhm.fk_module_id
INNER JOIN
    user as u ON uhm.fk_user_id = u.user_id
INNER JOIN
    chapter as c ON uhm.fk_latest_chapter_id = c.chapter_id
WHERE 
    u.user_id = 2;

结果集 2

于 2013-08-12T09:27:34.313 回答