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

问题描述 投票:0回答:1

我有一个查询,我在哪里获取学生人数。现在,我想修改该查询并有条件地对其进行管理。这是我的查询

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

返回语法错误。我该如何处理?

php mysql sql join where-clause
1个回答
0
投票

只需使用布尔逻辑:

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。您可能需要在onjoin子句中使用此条件。

© www.soinside.com 2019 - 2024. All rights reserved.