ZF - MySQL SUM 查询使用 CASE WHEN
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
- 最好使用占位符,所以语句是 'prepared' - 以尽量减少机会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);
经过对准备好的语句的研究here,看来最好的方法是:
$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);
尝试在 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
- 最好使用占位符,所以语句是 'prepared' - 以尽量减少机会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);
经过对准备好的语句的研究here,看来最好的方法是:
$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);