WHERE子句如果匹配

时间:2014-01-23 19:59:38

标签: mysql

根据WHERE的结果,使JOIN子句的一部分最简单的方法是什么?我意识到这是一个非常含糊不清和令人困惑的问题,所以请允许我简单地向您展示我想要实现的目标:

SELECT m.member_id, m.first_name, m.last_name
FROM cal_form_answers a
INNER JOIN cal_form_elements e
    USING(element_id)
INNER JOIN cal_forms f
    USING(form_id)
LEFT JOIN members m
    USING(member_id)
WHERE f.org_id = ?
    AND m.org_id = ?
    AND e.form_id = ?
GROUP BY a.member_id
ORDER BY a.member_id

首先,请注意问号不是无效的语法 - 我正在使用Codeigniter,它将它们用作绑定参数。

第10行(AND m.org_id = ?)取决于LEFT JOIN是否确实找到了某些内容。如果members表中没有匹配项,则不需要第10行。事实上,它成了一个问题。我想限制第10行的结果,除非成员表中没有匹配项。在那种情况下,我只想忽略WHERE子句的那一部分。

我相信这可以使用子查询来实现,尽管我不确定如何计算语法。还有其他方法吗?如果是,那么这个结果怎么可能实现呢?如果没有其他方法,有人可以为这种情况展示子查询的实现,并解释它是如何工作的吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

如果LEFT JOIN与记录不匹配,则那些LEFT JOINed字段为空。为什么不检查该字段是否为空,如果不是,则检查它。)

SELECT m.member_id, m.first_name, m.last_name
FROM cal_form_answers a
INNER JOIN cal_form_elements e
    USING(element_id)
INNER JOIN cal_forms f
    USING(form_id)
LEFT JOIN members m
    USING(member_id)
WHERE f.org_id = ?
    AND (m.org_id = ? OR m.org_id IS NULL)
    AND e.form_id = ?
GROUP BY a.member_id
ORDER BY a.member_id