SQL Concat Where子句

时间:2017-08-08 08:19:53

标签: php mysql sql

有什么更好的解决方法。

我有一个包含三个可选参数的函数(businessunit_id,department_id,jobtitle)。我必须根据接收参数构建动态 WHERE SQL子句。

代码

var array1 = [0, 1, 2, 3, 4, 5, 6];
var array2 = [7, 8, 1, 2, 9, 10];
var duplicateRemoved = [];
/* run a function for every value in array2 and collect the unique value in a new array */
array2.forEach(function(currentValue, index, arr){
      if (array1.indexOf(currentValue) === -1) {
          duplicateRemoved.push(currentValue);
      }
});

console.log(duplicateRemoved)

在上面的代码中。要构建 WHERE 条件,我正在汇总 $ WHERE 变量并使用 $ i 变量来跟踪需要的 AND 条件。

是否有任何优化方法可以实现这一目标?

2 个答案:

答案 0 :(得分:1)

  

是否有任何优化方法可以实现这一目标?

我将其解释为“更易于维护,更易于阅读”而非“性能优化” - 基于更广泛问题的背景。

这种代码是我鼓励其他程序员使用数据库抽象库的80%的原因。性能成本很少会影响代码清洁度。

看起来你并没有使用PHP框架,所以我猜你可能还没有使用composer。我建议将其介绍给您的项目,然后使用它来引入数据抽象,如doctrineeloquent

您可以在SO上找到大量有关使用这些库和工具的帮助。

doctrine为您dbal提供了一个位于doctrine本身和PDO之间的图书馆。

如果使用dbal(或更高级别的库),您将开始停止考虑SQL(和注入保护等),并开始考虑用可读的PHP代码从数据库中描述您想要的内容。 / p>

例如:使用面向对象的界面,构建广泛的where子句变得易于维护(警告:从过去的内存中编写的代码,可能不是字面上正确):

$queryBuilder
    ->select('id', 'name')
    ->from('main_employees_summary');

if ($x) {
    $queryBuilder
        ->andWhere('businessunit_id = ?')
        ->setParameter(0, $businessunit_id);
}

if ($y) {
    $queryBuilder
        ->andWhere('department_id = ?')
        ->setParameter(0, $department_id);
}

// ... etc

答案 1 :(得分:0)

我们可以避免使用$ i如下:

$WHERE = "";
if (!empty($businessunit_id))
{
   $WHERE .= "businessunit_id='{$businessunit_id}' AND ";
}

if (!empty($department_id))
{
    $WHERE .= "department_id='{$department_id}' AND ";
}

if (!empty($jobtitle))
{
    $WHERE .= "jobtitle_id='{$jobtitle}' AND ";
}
if ($WHERE) {
    $WHERE = preg_replace('/AND\s$/', '', $WHERE);//removing the last 'AND '
    $query = "SELECT *  FROM `main_employees_summary` WHERE $WHERE ";
    $data  = $db->query($query)->fetchAll();
}
return $data;

或使用数组

$whereArr = array();
if (!empty($businessunit_id))
{
   $whereArr[] = "businessunit_id='{$businessunit_id}'";
}
//.......
if (!empty($whereArr)) {
    $WHERE = implode(' AND ', $whereArr);//joining with ' AND '
    $query = "SELECT *  FROM `main_employees_summary` WHERE $WHERE ";
    //.....
}