繁体   English   中英

ZF-使用CASE WHEN的MySQL SUM查询

[英]ZF - MySQL SUM query using CASE WHEN

尝试在zend框架中编写以下查询1:

SELECT
    SUM(CASE WHEN column2 = 'value1' THEN column3 END) AS 'mySpecialSum',
FROM `my_table` 
WHERE column4='value2' AND column5='value3'

测试我正在这样写:

$select = $this->select()
    ->from('my_table', array(
        'mySpecialSum'=>'SUM(CASE WHEN column2 = "value1" THEN column3 END)'
    ))
    ->where('column4=?', $value2)
    ->where('column5=?', $value3);
$data = $this->fetchAll($select);

哪个有效-但我需要知道如何将value1作为变量包括-例如$value1最好使用占位符,以便语句“准备好”-以最大程度减少SQL注入的机会。

当前正在尝试两个选项(不起作用):

$select = $this->select()
    ->from('my_table', array(
        'mySpecialSum'=>'SUM(CASE WHEN column2 = "{$value1}" THEN column3 END)'
    ))
    ->where('column4=?', $value2)
    ->where('column5=?', $value3);
$data = $this->fetchAll($select);

要么

$select = $this->select()
    ->from('my_table', array(
        'mySpecialSum'=>'SUM(CASE WHEN column2 = "{$this->_db->quote($value1)}" THEN column3 END)'
    ))
    ->where('column4=?', $value2)
    ->where('column5=?', $value3);
$data = $this->fetchAll($select);

这里对准备好的语句进行了一些研究之后,看来最好的方法是:

$sql = 'SELECT SUM(CASE WHEN column2 = ? THEN column3 END) AS "mySpecialSum",
FROM my_table
WHERE content_type = ?
AND content_id = ?';

$preparedStatement = $this->getAdapter()->query($sql, array($value1, $value2, $value3));
$data = $preparedStatement->fetchAll();

两个选项也都可以使用 -但都感觉像是被黑客入侵(顺便说一下,它们也比上面的“ prepared statement”方法要慢一些)-

$select = $this->select()
    ->from('my_table', array(
        'mySpecialSum'=>'SUM(CASE WHEN column2 = "' . $value1 . '" THEN column3 END)'
    ))
    ->where('column4=?', $value2)
    ->where('column5=?', $value3);
$data = $this->fetchAll($select);

和:

$start = microtime();

$select = $this->select()
    ->from('my_table', array(
        'mySpecialSum'=>'SUM(CASE WHEN column2 = ' . $this->_db->quote($value1) . ' THEN column3 END)'
    ))
    ->where('column4=?', $value2)
    ->where('column5=?', $value3);
$data = $this->fetchAll($select);

$end = microtime();
$timeTaken = $end - $start;

之前和之后的microtime()是一项速度测试,用于比较两种方法:
...显示使用zf $this->_db->quote()差异可忽略不计

但是,奇怪的是,使用$this->getAdapter()->select()而不是简单地使用$this->select()时,速度提高了5倍:

$select = $this->getAdapter()
    ->select()
    ->from('my_table', array(
        'mySpecialSum'=>'SUM(CASE WHEN column2 = ' . $this->_db->quote($value1) . ' THEN column3 END)'
    ))
    ->where('column4=?', $value2)
    ->where('column5=?', $value3);
$data = $this->getAdapter()->fetchAll($select);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM