0

我有一个 SQL 查询在一定程度上可以正常工作。

LEFT OUTER JOIN 工作正常,但如果 mdl_modules 或 mdl_resource 中没有记录,它会出现 NULL。

如何从 mdl_course_modules 中排除记录,其中任何一个 LEFT OUTER JOIN 都没有记录?

我想我会使用 ISNULL() 但不确定与我的查询合并的正确语法。

这是我的查询:

SELECT SQL_CALC_FOUND_ROWS ".str_replace(" , ", " ", "cm.id AS theid, m.name AS mname, r.name AS resourcename, r.summary AS resourcesummary,
        FROM_UNIXTIME(cm.added, '%D %M %Y') AS dateadded")."
        FROM mdl_course_modules cm 
        LEFT OUTER JOIN mdl_modules m on cm.module = m.id
        LEFT OUTER JOIN mdl_resource r on cm.instance = r.id
        WHERE m.name = 'resource' AND cm.visible = 1
        $scourse
        $sWhere
        $sOrder
        $sLimit
4

2 回答 2

1

通常这可以通过切换到 a 来完成INNER JOIN,但INNER JOIN在 MySql 中相当于 a CROSS JOIN,因此实际上无济于事。

要解决此问题,请添加所需的WHERE条件,使用ISNULL

SELECT ...
    FROM_UNIXTIME(cm.added, '%D %M %Y') AS dateadded")."
    FROM mdl_course_modules cm 
    LEFT OUTER JOIN mdl_modules m on cm.module = m.id
    LEFT OUTER JOIN mdl_resource r on cm.instance = r.id
    WHERE m.name = 'resource' AND cm.visible = 1
        && (!ISNULL(m.name) || !ISNULL(r.name))
于 2012-05-15T09:20:09.903 回答
1

WHERE m.name = 'resource' AND cm.visible=1 AND (m.id IS NOT NULL OR r.id IS NOT NULL)

于 2012-05-15T09:49:29.257 回答