我有一个查询,我在哪里获取学生人数。现在,我想修改该查询并有条件地对其进行管理。这是我的查询
SELECT count(students.id) AS student_count,
FROM students
LEFT JOIN students_admission ON students_admission.student_id = students.id
WHERE student_gender='Male'
AND students.address = 'Address'
GROUP BY id
这就是我想要的
$admission_date = null;
SELECT count(students.id) AS student_count,
FROM students
LEFT JOIN students_admission ON students_admission.student_id = students.id
WHERE student_gender='Male'
AND students.address = 'Address'
AND students_admission.admission_date = '$admission_date'
GROUP BY id
但是,我想添加AND students_admission.admission_date = 'admission_date'
仅当$ admission_date不为null时,此条件。所以,我尝试了这个
SELECT count(students.id) AS student_count,
FROM students
LEFT JOIN students_admission ON students_admission.student_id = students.id
WHERE student_gender='Male'
AND students.address = 'Address'
CASE WHEN '$admission_date' IS NOT NULL THEN students_admission.admission_date = '$admission_date' END
GROUP BY id
返回语法错误。我该如何处理?
只需使用布尔逻辑:
AND (
:admission_date IS NULL
OR students_admission.admission_date = :admission_date
)
您也可以这样表达:
students_admission.admission_date = coalesce(:admission_date, students_admission.admission_date)
请注意,您应该使用参数化查询,而不是将字符串变量混入查询字符串中:这既更高效也更安全(您的当前代码广泛暴露于SQL注入中)。有关原因和方式,请参见this famous SO post。
[另外,请注意,在查询的left join
子句中在where
ed表上放置条件实际上会将left join
转换为inner join
。您可能需要在on
的join
子句中使用此条件。