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');