我有一个自定义模块,它有自己的网格。我输入网格的一个字段是与条目关联的记录(笔记)计数。它运行正常并显示网格中的计数,它也很好,但是当我过滤时,我收到一条消息,说它无法找到列。
这是错误:
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'note_count' in 'where clause'
这是代码
class Ssi_Crm_Model_Mysql4_Quote_Collection extends Mage_Core_Model_Mysql4_Collection_Abstract
{
protected function _construct()
{
$this->_init('crm/quote');
}
protected function _initSelect()
{
parent::_initSelect();
$this->_joinUserSet();
return $this;
}
protected function _joinUserSet()
{
$this->getSelect()
->columns("(SELECT COUNT(note) FROM mage_crm_notes WHERE entity_id = main_table.quote_id AND entity_type = 'quote') as note_count")
->join(
array('user'=>$this->getTable('admin/user')),
'main_table.user_id=user.user_id',
array('username' => 'user.username', 'email' => 'user.email'));
return $this;
}
答案 0 :(得分:1)
Chris,你不能在mySql Where子句中使用别名,这就是你在尝试过滤结果时遇到错误的原因。这不是mySql错误,但在http://bugs.mysql.com/bug.php?id=1505
上看到类似的查询说你的sql是......
SELECT field1,field2,(SELECT COUNT(note)FROM mage_crm_notes WHERE entity_id = main_table.quote_id AND entity_type ='quote')note_count FROM mage_crm
你会得到预期的三列......
:field1:field2:note_count:
但你不能......
SELECT field1,field2,(SELECT COUNT(note)FROM mage_crm_notes WHERE entity_id = main_table.quote_id AND entity_type ='quote')as note_count FROM mage_crm WHERE note_count> 5
因为你会在'where子句'错误中得到未知列'note_count'。
根据您的过滤方式,您可以使用HAVING子句。通过StackOverflow搜索类似的查询(例如Can you use an alias in the WHERE clause in mysql?)
答案 1 :(得分:0)
处理此问题的一种方法(必须有其他方法)是使用集合而不是查询,以便它知道如何正确过滤。
而不是getSelect()->columns()
尝试addExpressionAttributeToSelect()
$this->addExpressionAttributeToSelect('note_count',
'(SELECT COUNT(note) FROM mage_crm_notes WHERE entity_id = main_table.quote_id AND entity_type = "quote")',
''
)
->joinTable(
array('user'=>'admin/user'),
'user_id=user_id',
array('username' => 'user.username', 'email' => 'user.email')
);
如果不使用EAV集合,实现与addExpressionAttributeToSelect()
相同效果的难看方式是:
$this->_map['fields']['note_count'] = '(SELECT COUNT(note) FROM mage_crm_notes WHERE entity_id = main_table.quote_id AND entity_type = "quote")';