哪一个更好?什么时候或者如果?

时间:2016-07-26 06:50:12

标签: php mysql codeigniter

我的情况是这样的:

这样的情况:

public function get_opportunity($customer_id, $group_id, $action)
{
    $sql = "SELECT COUNT(transaction_id) AS total_transaction 
            FROM `transaction` 
            WHERE 
                CASE 
                    WHEN '$action' = 'view_all' THEN transaction_id IS NOT NULL
                    WHEN '$action' = 'view_group' THEN group_id IN($group_id) 
                    ELSE transaction_created_by = ? 
                END 
            ";

    $result = $this->db->query($sql, array($customer_id))->result_array();

    return ($result[0]['total_transaction']) ? $result[0]['total_transaction'] : 0;
}

如果是这样的话:

public function get_opportunity($customer_id, $group_id, $action)
{
    if($action == "view_all")
        $condition = " transaction_id IS NOT NULL";
    else if($action == 'view_group')
        $condition = " group_id IN($group_id)";
    else
        $condition = " customer_id = ?";

    $sql = "SELECT COUNT(transaction_id) AS total_transaction 
            FROM `transaction` 
            WHERE $condition";

    $result = $this->db->query($sql, array($customer_id))->result_array();

    return ($result[0]['total_transaction']) ? $result[0]['total_transaction'] : 0;
}

我试过了。所有类型的上述工作。但在这里我问,哪一个更好?

2 个答案:

答案 0 :(得分:2)

那可能不对,第一个代码应该不起作用!在SQL CASE中是表达式,而不是语句。您不能在THEN部分添加条件,只能输入一个值。 MySQL将布尔表达式计算为1 \ 0,所以你的情况基本上是这样的:

WHERE CASE... THEN (Cond) -- equals to 1/0 
              THEN (Cond) -- equals to 1/0
              ELSE (Cond) -- -- equals to 1/0 

大多数RDBMS都会抛出错误。

你可以这样格式化:

SELECT COUNT(transaction_id) AS total_transaction 
            FROM `transaction` 
            WHERE ('$action' = 'view_all' AND transaction_id IS NOT NULL) OR 
                  ('$action' = 'view_group' THEN group_id IN($group_id)) OR
                  transaction_created_by = ?       

只要你没有遇到性能问题,就不要考虑这件事, 它会浪费你的时间。选择一个更容易维护的那个。

答案 1 :(得分:2)

除了@sagi提出的问题,实际上第二种方法更好,因为有些不相关的原因。在第一个示例中,您直接在查询字符串中使用变量$action,这可能会为SQL注入打开攻击向量,因为它来自方法范围之外,可能不安全。而在第二个示例中,变量$condition在方法中受到控制并且可以安全使用。

除此之外,只要性能不是问题,我就会考虑可读性。出于这个原因,我甚至可能将它分成3个单独的,明确命名的函数,而不是具有非常相似的SQL。这样就可以清楚地知道发生了什么,并且每个案例都可以“发展”#34;独立而不是1种方法,其中添加越来越多的案例和ifs。

编辑:您也可以清楚地命名该功能,例如

  • getAllTransactionCounts()
  • getTransactionCountForCustomers($ transactionIds)
  • getTransactionCountForCustomer($客户ID)