mysql 4 way join为所有字段返回null

时间:2018-03-17 05:39:03

标签: mysql

我正在构建一个SQL查询 1)创建一个group_concat,如果值不为null,则返回json 2)将一个表(句柄)连接到两个不同的表。

我在查询时遇到两个问题 1)当我得到'应该'失败并且返回0行的结果时,我得到一行,其中所有字段都为空 2)当我有一个没有活动的scene时,我最终得到一个JSON_OBJECT,其中所有字段都为空

    SELECT h.name as name, s.*, 
        GROUP_CONCAT(JSON_OBJECT(
            'activityId', a.id,
            'name', ah.name,
            'settings', a.settings,
        ) SEPARATOR ',') as activities
        FROM scene AS s
        INNER JOIN user AS h ON s.uid = h.id
        LEFT JOIN scene_activities AS sa ON sa.sid = s.id
        LEFT JOIN activity AS a ON sa.aid = a.id
        LEFT JOIN user AS ah ON a.uid = ah.id
  WHERE s.scene_id = ?

如何设置上述字段,以便不返回Scene的空集或JSON_OBJECT的空集为空。

1 个答案:

答案 0 :(得分:1)

如果您要求json中的所有属性都具有非空值,请不要使用left连接(如果没有匹配的行,则返回空值)并在其上添加条件连接行中的值也是:

SELECT h.name as name, s.*, 
    GROUP_CONCAT(JSON_OBJECT(
        'activityId', a.id,
        'name', ah.name,
        'settings', a.settings,
    ) SEPARATOR ',') as activities
FROM scene AS s
JOIN user AS h ON s.uid = h.id
JOIN scene_activities AS sa ON sa.sid = s.id
JOIN activity AS a ON sa.aid = a.id
    and a.settings is not null
JOIN user AS ah ON a.uid = ah.id
    and ah.name is not null
WHERE s.scene_id = ?