【问题标题】:Multiple MySQL Statements多个 MySQL 语句
【发布时间】:2016-10-22 17:57:20
【问题描述】:

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

当用户选择所有字段user_iddate_fromdate_toclient_name 时,我的查询工作正常,结果显示为但我似乎无法在只有date_fromdate_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 . "')

【问题讨论】:

  • 然后用 OR 代替 AND
  • 或者,省略用户未选择的字段。日期的情况除外。执行BETWEEN 时必须有两个日期。因此,如果未选择日期,请将其设置为可能的最高或最低值。
  • 我已尝试更改 and to or 但它不起作用。如果我选择说 client_name 是的,它可以工作,但如果我选择 user_id 和 client_name 它不能正常工作,它会显示分配给 staff_id 的所有结果。
  • @craigb88:你试过什么?
  • 抱歉刚刚编辑了帖子。我已将 AND 更改为 OR

标签: php mysql


【解决方案1】:

用这个技巧做你的陈述应该有效:

SELECT *
FROM jobs
WHERE (Client_name = :clientName OR :clientName is null) 
AND ...

如果您的用户没有填写client_name,则条件为真,因为输入将为空,如果他填写,它将搜索他写的内容!

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

这里的另一个例子:https://stackoverflow.com/a/30030510/4734085

【讨论】:

    【解决方案2】:

    您需要使用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 . "')
    

    【讨论】:

    • 这给了我这个错误你的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 2 行的 'OR '1970-01-01' OR client_name='' OR staff_id= '3'' 附近使用正确的语法 SELECT * FROM @987654326 @ WHERE job_date BETWEEN '1970-01-01' OR '1970-01-01' OR client_name='' OR staff_id= '3'
    • @craigb88 我在那里犯了一个错误,更正了同样的错误.. 请立即检查
    • 当staff_id 和client_name 被选中时,仍然返回分配给staff_id 的所有结果。
    【解决方案3】:

    根据设置的字段动态构建条件:

    $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'
    

    【讨论】:

    • 谢谢,我现在就试一试。只需要尝试让它与 codeigniter 一起工作。希望这会起作用:)
    猜你喜欢
    • 1970-01-01
    • 2016-01-04
    • 2012-03-27
    • 1970-01-01
    • 2013-10-11
    • 2011-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多