MySQL连接一个值可以是可选的

时间:2013-08-12 08:44:31

标签: mysql join where optional

情况

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

MySQL Diagram

目标

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

  • 如果“user_has_module.fk_chapter_id”为空,系统可以返回模块的详细信息,然后返回null章。
  • 如果有user_has_module,我想获得状态

问题

每当我执行SQL语句时,我只会部分返回结果。 I.E.如果我总共有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;

results

1 个答案:

答案 0 :(得分: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;

result set 2