我遇到一些MySQL查询问题,我们将不胜感激。我基本上有一个包含作业信息的表,我的查询是从表单中的多个选择中确定的。所以有date_from
,date_to
,client_name
和user_id
。
当用户选择显示结果的所有字段date_from
,date_to
,client_name
和date_from
时,我的查询工作正常但我似乎无法得到它仅在选择date_to
和client_name
或SELECT * FROM `jobs`
WHERE (`job_date` BETWEEN '" . date('Y-m-d', strtotime($from_date)) . "' AND '" . date('Y-m-d', strtotime($to_date)) . "'
AND `client_name`='" . $client_name . "'
AND `staff_id`= '" . $staff_id . "')
和日期等时工作。
如果只选择了一个字段或选择了所有字段,则查询需要起作用。
跳跃有意义!这是我的代码,当所有字段全部填写时,结果都有效。
class MyPair{
String id;
String email;
public String toString(){
return id + " - " + email;
}
}
答案 0 :(得分:2)
根据设置的字段动态构建条件:
$query = "SELECT * FROM `jobs`";
$conditions = array();
if ( !empty($from_date) && !empty($to_date) ) {
$conditions[] = "`job_date` BETWEEN '" . date('Y-m-d', strtotime($from_date)) . "' AND '" . date('Y-m-d', strtotime($to_date)) . "'";
}
else {
if ( !empty($from_date) )
$conditions[] = "`job_date` > '" . date('Y-m-d', strtotime($from_date)) . "'";
if ( !empty($to_date) )
$conditions[] = "`job_date` < '" . date('Y-m-d', strtotime($to_date)) . "'";
}
if ( !empty($client_name ) )
$conditions[] = "`client_name`='" . $client_name . "'";
if ( !empty($staff_id ) )
$conditions[] = "`staff_id`='" . $staff_id . "'";
if ( sizeof( $conditions ) > 0 ) {
$query .= " WHERE " . implode( " AND ", $conditions );
}
这将导致查询仅包含实际已设置的字段。空字段不会处于这种状态。
例如。如果设置了$from_date
,$to_date
和$staff_id
,则会产生以下结果:
SELECT * FROM `jobs` WHERE `job_date` BETWEEN '2016-02-23' AND '2016-06-15' AND `staff_id`='foo'
答案 1 :(得分:0)
您需要使用OR
条件而不是AND
。请尝试如下:
SELECT * FROM `jobs`
WHERE (`job_date` BETWEEN '" . date('Y-m-d', strtotime($from_date)) . "' AND '" . date('Y-m-d', strtotime($to_date)) . "'
OR `client_name`='" . $client_name . "'
OR `staff_id`= '" . $staff_id . "')
答案 2 :(得分:0)
用这个技巧做你的陈述应该有效:
SELECT *
FROM jobs
WHERE (Client_name = :clientName OR :clientName is null)
AND ...
如果你的用户没有填写client_name,那么条件将为true,因为输入将为null,如果填充它,它将搜索他写的内容!
它允许您只发表一个声明。