Php Zendframework工会问题

Php Zendframework工会问题,php,sql,zend-framework,zend-db,Php,Sql,Zend Framework,Zend Db,我正在运行这个代码 $sq = $this->_codes->getAdapter()->select() ->from (array('cs' => 'code_statuses'), array('total' => 'count(*)')) ->join ( array ('c' => 'codes'), 'c.code_id = cs.code_id',

我正在运行这个代码

$sq = $this->_codes->getAdapter()->select()
            ->from (array('cs' => 'code_statuses'), array('total' =>     'count(*)'))
            ->join (
                array ('c' => 'codes'), 'c.code_id = cs.code_id', 
                array ('human_state' => new Zend_Db_Expr("CASE c.state_id WHEN 3 THEN 'active' WHEN 5 THEN 'suspended' ELSE 'inactive' END"), 'c.*')
            )
            ->group('cs.code_id');


但是单独的
$sq
$sqtemp
工作正常

SQLSTATE[42S22]:未找到列:1054“order子句”中的未知列“cs.code\u id”

我不知道我哪里出错了

任何帮助都将不胜感激

*编辑

选择count(*)作为'total',
案例c.国家识别号
当3时,则为“活动”
当5时,则“暂停”
否则“不活动”
结尾为'human_state','c`.*
从'code_status'改为'cs`
内部联接'code'为'c`
在c.code\u id=cs.code\u id上
其中(cs.state\u id=1或cs.state\u id=2或cs.state\u id=4)

按“cs”分组。“code\u id”拥有(总计在第二次查看您的代码后,我怀疑
order()
呼叫了工会。您是按
cs.code\u id
排序的,在任何
select
语句中都没有提到这一点,
c.code\u id

尝试在代码< >代码> >代码> >代码> >代码> >代码> >选择< <代码>联合> <代码>,可能考虑使用别名,然后您可以在<代码>订单子句中使用.<
$sq = $this->_codes->getAdapter()->select()
            ->from(array('cs' => 'code_statuses'),
                   array(
                       'total'     => 'count(*)'
                       'cscodeids' => 'code_ids',
                   ));
//...
$union = $this->_codes->getAdapter()
              ->select()
              ->union(array($sq,$sqtemp))
              ->order('cscodeids');
我相信这应该行得通。我从不同的地方获得了灵感。以下是一些链接,可以找到我的答案(无法找到所有答案):

  • :旧错误报告…包含一些详细信息

您使用的是哪个版本的ZendFW?分别是
(string)$sq
(string)$sqtemp
的输出是什么?是
(string)的输出是什么zend版本是1.12.31请参见上面关于$sq和$sqtempUnion的编辑,所有这些都会给我相同的错误$sq=$this->\u codes->getAdapter()->select()->union(array($sq,$sqtemp),Zend_Db_Select::SQL_union_ALL)->order('cs.code_id');SQLSTATE[42S22]:Column not found:1054未知列'order clause'中的'c.code',只需将查询复制粘贴到mysql(workbench,或您拥有的其他工具,甚至cli都可以),然后将其分解,找到语法错误。我不是免费的调试器(我和其他任何人一样,讨厌调试,但我们都必须这么做)原始SQL在mysql中运行良好,所以我怀疑它与zend Framework有关谢谢,我会看看那些文档$sq应该是$sqfinal=$this->\u code->getAdapter()->select()->union(array($sq,$sqtemp))->order('cs.code\u id'));很抱歉,我在页面底部发现了一些代码,这些代码正在执行此$sq->order('c.code ASC');我对其进行了注释,我的查询非常有效,但可能会影响其他查询,我将对此进行研究感谢您的帮助,非常感谢:)@user2764582:您可以尝试手动创建
union
查询,因为要在构成
union
的查询中使用
ORDER BY
,必须使用括号:
$sqfinal='('(字符串)$sq.')union('.$sqtemp');
。。。
if (!empty($options['state_id'])):
            if (is_array($options['state_id'])):
                $states = 'cs.state_id=' . implode(' OR cs.state_id=', $options['state_id']);
                $sq->where($states)
                                       ->having(total<=4);
                $sqtemp->where ('cs.state_id=5')
                                            ->having(total<4);
            else:
                $sq->where ('cs.state_id=?', $options['state_id']);
            endif;
$sqfinal=$this->_codes->getAdapter()->select()
                ->union(array($sq,$sqtemp))
                ->order('cs.code_id');
SELECT count(*) AS `total`, 
CASE c.state_id 
WHEN 3 THEN 'active' 
WHEN 5 THEN 'suspended' 
ELSE 'inactive' 
END AS `human_state`, `c`.* 
FROM `code_statuses` AS `cs` 
INNER JOIN `codes` AS `c` 
ON c.code_id = cs.code_id 
WHERE (cs.state_id=1 OR cs.state_id=2 OR cs.state_id=4) 
GROUP BY `cs`.`code_id` HAVING (total<=4) 
UNION 
SELECT count(*) AS `total`, 
CASE c.state_id 
WHEN 3 THEN 'active' 
WHEN 5 THEN 'suspended' 
ELSE 'inactive' 
END AS `human_state`, `c`.* 
FROM `code_statuses` AS `cs` 
INNER JOIN `codes` AS `c` 
ON c.code_id = cs.code_id 
WHERE (cs.state_id=5) 
GROUP BY `cs`.`code_id` 
HAVING (total<4)
$sq = $this->_codes->getAdapter()->select()
            ->from(array('cs' => 'code_statuses'),
                   array(
                       'total'     => 'count(*)'
                       'cscodeids' => 'code_ids',
                   ));
//...
$union = $this->_codes->getAdapter()
              ->select()
              ->union(array($sq,$sqtemp))
              ->order('cscodeids');