1

我有以下查询从数据库中选择一些记录:

$select_person = $this->select()
        ->setIntegrityCheck(false)
        ->from(array('a' => 'tableA'), 
                array(new Zend_Db_Expr('SQL_CALC_FOUND_ROWS a.id'),
                        'a.cid',  
                        'a.email',
                        'final' => new Zend_Db_Expr( "concat( '<div 
                            style=\"color:#1569C7; font-weight:bold\">',
                            a.head , ' ' ,  a.tail,  '</div>')" ),
                        'a.red_flag'
                )
        )   
        ->joinLeft(array('b' => 'tableb'), ... blah blah)
        ->where('blah blah')
        ->order('a.head ASC')

我想修改上面的查询,以便它根据值选择不同'final'的值

a.red_flag.

可以有值 - true 或 false。

我知道我可以使用 mysql 的 CASE 语句 - 例如如下所示:

'final' => new Zend_Db_Expr("CASE a.red_flag WHEN 'true' THEN '$concatstr1'
                        ELSE '$concatstr2' END")

的价值$concatstr1 = "concat( '<div style=\"color:red; font-weight:bold\">', a.head , ' ' , a.tail, '</div>')" ;

的价值$concatstr2 = "concat( '<div style=\"color:blue; font-weight:bold\">', a.head , ' ' , a.tail, '</div>')" ;

但是,它会抛出一个错误说

消息:SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 'div style="color:red; font-weight:bold">', a.head , ' ' , ' 附近使用正确的语法

我怎样才能使这个查询工作?任何帮助是极大的赞赏。

谢谢

4

2 回答 2

3

个人而言,我不喜欢从数据库中获取 HTML 作为答案。之后调试和更改会变得混乱和困难。此外,由于与 ' 和 " 以及 MySQL 中的所有保留字符(<、>、;、...)混淆,您可能会遇到一些错误,我建议您尝试以下操作:

'final' => new Zend_Db_Expr("CASE a.red_flag WHEN 'true' THEN 1
                        ELSE 0 END")

然后检查 a.red_flag 的值;

if($this->final) {
    $output .= '<div style=\"color:red; font-weight:bold\">';
} else {
    $output .= '<div style=\"color:blue; font-weight:bold\">';
}
$output .= $this->head.' '.$this->tail;
$output .= '</div>';

如果查询仍然不起作用。尝试

echo $select->__toString; exit();

并检查查询。尝试使用数据库上的 __toString 获得的输出并检查它是否有效。以这种方式修复它更容易。您也可以在此处显示查询字符串,这样会更容易调试。

于 2012-07-27T10:10:28.307 回答
1

最后,我在我的陈述中发现了错误。罪魁祸首是——我在声明中$concatstr1和声明中使用了引号。正确的查询应该形成如下:$concatstr2$select_person

$select_person = $this->select()
        ->setIntegrityCheck(false)
        ->from(array('a' => 'tableA'), 
                array(new Zend_Db_Expr('SQL_CALC_FOUND_ROWS a.id'),
                        'a.cid',  
                        'a.email',
                        final' => new Zend_Db_Expr("CASE a.red_flag WHEN 'true' THEN $concatstr1 ELSE $concatstr2 END"),
                        'a.red_flag'
                )
        )   
        ->joinLeft(array('b' => 'tableb'), ... blah blah)
        ->where('blah blah')
        ->order('a.head ASC');

这现在返回给我适当的 ' final' 值 -否则它返回concatstr1我。red_flagtrueconcatstr2

于 2012-08-07T23:04:08.987 回答