2014-01-23 102 views
0

根据JOIN的结果生成WHERE子句的一部分的最简单方法是什么?我知道这是一个非常模糊的和混乱的问题,所以请允许我简单地告诉你我想实现:WHERE子句如果匹配

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 

首先,注意问号是不是无效的语法,我使用笨,这使用它们作为绑定参数。

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

我相信这可以使用子查询来实现,但我承认不确定如何制定语法。有没有其他方法?如果是的话,这个结果如何能够实现?如果没有其他方式,有人可以演示一个子查询的实现情况,并解释它是如何工作的?

谢谢!

+1

那么,为什么不在连接条件部分指定这些条件呢? – zerkms

回答

0

如果LEFT JOIN与记录不匹配,那么这些LEFT JOINed字段为空。为什么不只是检查该字段是否为NULL,以及何时不检查它)

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 
+0

啊,傻了。尽管多年的网站开发,我仍然发现自己无法在SQL中清晰地思考。我知道这很简单!谢谢。 :) – Nathanael