在php中有条件地管理mysql查询

在php中有条件地管理mysql查询,php,mysql,sql,join,where-clause,Php,Mysql,Sql,Join,Where Clause,我有一个问题,我从哪里得到学生人数。现在,我想修改该查询并有条件地管理它。 这是我的问题 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 i

我有一个问题,我从哪里得到学生人数。现在,我想修改该查询并有条件地管理它。 这是我的问题

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
但是,我想补充一点
和学生入学。入学日期=“入学日期”
此条件仅在$ADCENTION_date不为空时出现。所以,我试过这个

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注入)。看看原因和方法


另外,请注意,在查询的
where
子句中的
left join
ed表中添加条件实际上会将
left join
转换为
内部join
。您可能希望在
join
on
子句中使用此条件。

我在顶部声明了$admission\u date变量。有时,此变量有一个值,有时此变量设置为null。我不想在变量的值设置为null时运行和设置条件。