gpt4 book ai didi

mysql - ZF - 使用 CASE WHEN 的 MySQL SUM 查询

转载 作者:行者123 更新时间:2023-11-29 11:39:07 24 4
gpt4 key购买 nike

尝试在 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注入(inject)的机会。

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

$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();

两个选项工作 - 但都感觉像是黑客(顺便说一句,也比上面的“准备好的语句”方法稍慢) - 是:

$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() 或不使用 zf 的差异可以忽略不计

但是,奇怪的是,使用 $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);

关于mysql - ZF - 使用 CASE WHEN 的 MySQL SUM 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36097748/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com