2014-01-23 3 views
0

Каков самый простой способ сделать часть WHERE в зависимости от результата JOIN? Я понимаю, что это очень неоднозначный и запутанный вопрос, поэтому позвольте мне просто показать вам, что я пытаюсь достичь:Предложение 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 

Во-первых, обратите внимание, что вопросительные знаки не являются недействительным синтаксисом Я использую CodeIgniter, который использует их как связанные параметры.

Строка 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

Смежные вопросы