2014-01-23 123 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