【问题标题】:Using multiple and condition in join query在连接查询中使用多个和条件
【发布时间】:2018-07-24 05:17:32
【问题描述】:

如果帖子中的值不等于空白,我想加入查询,并且当两个帖子值中的值都可以完美运行时。问题是当该值仅在一个帖子中时,AND 位于任何其他第二个值之前。希望得到解决方案。我正在使用核心 PHP

if(!empty($_POST['agent_wise'])){       
    $agent_wise = $_POST['agent_wise'];
    $queryCondition .= "allusers.sno ='$agent_wise'";
} 

if(!empty($_POST['status_wise'])){      
    $status_wise = $_POST['status_wise'];
    $queryCondition .= " AND st_application.admin_status_crs ='$status_wise'";
}   
if(!empty($_POST['course_wise'])){      
    $course_wise = $_POST['course_wise'];
    $queryCondition .= " AND st_application.prg_name1 ='$course_wise'";
}


$result2 = "SELECT * FROM st_application INNER JOIN allusers on st_application.user_id = allusers.sno where " . $queryCondition . " ";

【问题讨论】:

  • 这个查询有什么错误?
  • @rajinder 如果第一个条件不满足,查询将失败
  • 好的。 “AND”关键字的问题。让你在答案中更新代码

标签: php mysql join where-clause


【解决方案1】:

试试这个代码。

if(!empty($_POST['agent_wise'])){      
    $agent_wise = $_POST['agent_wise'];
    $queryCondition .= "allusers.sno ='$agent_wise'";
 } 

if(!empty($_POST['status_wise'])){      
    $status_wise = $_POST['status_wise'];
    $queryCondition .= " AND st_application.admin_status_crs ='$status_wise'";
}   

if(!empty($_POST['course_wise'])){      
    $course_wise = $_POST['course_wise'];
    $queryCondition .= " AND st_application.prg_name1 ='$course_wise'";
}


$queryCondition = trim($queryCondition, 'AND'); 


$result2 = "SELECT * FROM st_application INNER JOIN allusers on st_application.user_id = allusers.sno where " . $queryCondition . " ";

希望对你有帮助

【讨论】:

【解决方案2】:

这里有解决方案...

$flag = 0;
if(!empty($_POST['agent_wise'])){ 
        $flag = 1;    
        $agent_wise = $_POST['agent_wise'];
        $queryCondition .= "allusers.sno ='$agent_wise'";
     } 

if(!empty($_POST['status_wise'])){      
        $status_wise = $_POST['status_wise'];
        if($flag == 1){
        $queryCondition .= " AND st_application.admin_status_crs ='$status_wise'";
        }
      else {
        $queryCondition .= " st_application.admin_status_crs ='$status_wise'";
         $flag = 1;
  }
    }   
    if(!empty($_POST['course_wise'])){      
        $course_wise = $_POST['course_wise'];
       if ($flag == 1){
        $queryCondition .= " AND st_application.prg_name1 ='$course_wise'";
      }
       else {
           $queryCondition .= " st_application.prg_name1 ='$course_wise'";
    }
    }


$result2 = "SELECT * FROM st_application INNER JOIN allusers on st_application.user_id = allusers.sno where " . $queryCondition . " ";

【讨论】:

【解决方案3】:

懒惰的技巧是在第一个条件中也包含AND,并将WHERE 更改为WHERE 1,但我怀疑有更智能且易于搜索的方法来解决这个问题。哦,还有关于sql注入和prepared statements的重要性

【讨论】:

    【解决方案4】:

    在连接“AND”之前检查空字符串。

    $queryCondition .=  (empty($queryCondition) ? "" : " AND ") . 
        "st_application.admin_status_crs ='$status_wise'"
    

    【讨论】:

      【解决方案5】:

      您的问题有两种解决方案。一种 SQL 方案和一种 PHP 方案:

      第一个解决方案

      if(!empty($_POST['agent_wise'])){       
          $agent_wise = $_POST['agent_wise'];
          $queryCondition .= " AND allusers.sno ='$agent_wise'";
      } 
      
      if(!empty($_POST['status_wise'])){      
          $status_wise = $_POST['status_wise'];
          $queryCondition .= " AND st_application.admin_status_crs ='$status_wise'";
      }   
      if(!empty($_POST['course_wise'])){      
          $course_wise = $_POST['course_wise'];
          $queryCondition .= " AND st_application.prg_name1 ='$course_wise'";
      }
      
      
      $result2 = "SELECT * FROM st_application INNER JOIN allusers on st_application.user_id = allusers.sno where TRUE" . $queryCondition . " ";
      

      这是有效的,因为在 WHERE TRUE AND 'something else' 中,TRUE 条件是多余的。唯一的缺点是,如果没有任何 POST 存在,您将获得所有记录,因为 WHERE TRUE 总是带回记录。但是您可以轻松地进行检查以查看所有 POST 是否存在,如果不存在则退出:

      if (empty($_POST['agent_wise']) && empty($_POST['status_wise']) && empty($_POST['course_wise']) ) exit;
      

      第二个解决方案

      $queryConditionsArray = [];
      
      if(!empty($_POST['agent_wise'])){       
          $agent_wise = $_POST['agent_wise'];
          $queryConditionsArray[] = "allusers.sno ='$agent_wise'";
      } 
      
      if(!empty($_POST['status_wise'])){      
          $status_wise = $_POST['status_wise'];
          $queryConditionsArray[] = "st_application.admin_status_crs ='$status_wise'";
      }   
      if(!empty($_POST['course_wise'])){      
          $course_wise = $_POST['course_wise'];
          $queryConditionsArray[] = "st_application.prg_name1 ='$course_wise'";
      }
      
      $queryCondition = implode(' AND ', $queryConditionsArray);
      
      $result2 = "SELECT * FROM st_application INNER JOIN allusers on st_application.user_id = allusers.sno where " . $queryCondition . " ";
      

      这是可行的,因为 implode 只会在条件之间插入单词“AND” - 而不是在每个条件的开头。同样,您必须检查是否没有 POST,否则您的 SQL 将失败。

      我个人更喜欢第二种方式,但要视情况而定。

      【讨论】:

        猜你喜欢
        • 2017-08-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多