多个MySQL语句

时间:2016-06-21 09:11:30

标签: php mysql

我遇到一些MySQL查询问题,我们将不胜感激。我基本上有一个包含作业信息的表,我的查询是从表单中的多个选择中确定的。所以有date_fromdate_toclient_nameuser_id

当用户选择显示结果的所有字段date_fromdate_toclient_namedate_from时,我的查询工作正常但我似乎无法得到它仅在选择date_toclient_nameSELECT * 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;
    }
}

3 个答案:

答案 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,如果填充它,它将搜索他写的内容!

它允许您只发表一个声明。

此处的另一个例子是:https://stackoverflow.com/a/30030510/4734085