我想在Mysql Concat Function
中使用like expression
。
我想将firstname
和lastname
合并为fullname
,并根据fullname
获得匹配的结果。我在YII1尝试了这个。以下是我的代码:
$criteria = new CDbCriteria();
$criteria->select = "*";
$criteria->select = 'CONCAT(firstname , "" , lastname) AS fullname';
$criteria->addCondition('fullname LIKE :match');
$criteria->params = array(':match' => $query);
$models = User::model()->findAll($criteria);
以下是生成的错误消息:
CDbCommand failed to execute the SQL statement: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'fullname' in 'where clause'
(Error 500)
CDbCommand::fetchColumn() failed: SQLSTATE[42S22]: Column not found: 1054
Unknown column 'fullname' in 'where clause'. The SQL statement executed
was: SELECT COUNT(*) FROM `members` `t` WHERE fullname LIKE :match.
提前致谢
答案 0 :(得分:2)
如果之后你不需要全名,你可以在WHERE子句中使用CONCAT方法:
$criteria = new CDbCriteria();
$criteria->addCondition('CONCAT(userId , " " , username) LIKE :match');
$criteria->params = array(':match' => $query);
$models = User::model()->findAll($criteria);
但是,如果您确实希望在SELECT子句中保留fullname,则只能在HAVING子句中使用此别名:
$criteria = new CDbCriteria();
$criteria->select = '*, CONCAT(userId , " " , username) AS fullname';
$criteria->having = 'fullname LIKE :match';
$criteria->params = array(':match' => $query);
$models = User::model()->findAll($criteria);
请注意,在这种情况下,您的用户模型应该具有fullname属性,否则您将无法访问fullname字段。
答案 1 :(得分:0)
我认为这是一种更为OO的方式使用SQL Functions
(@ JonathanStevens的回答是正确的):
$criteria = new CDbCriteria();
$criteria->select = ['*', new \CDbExpression("CONCAT(firstName, ' ', lastName) as fullname")];
$criteria->addCondition('CONCAT(firstName, ' ', lastName) LIKE :match'); <<<< This is still a problem
$criteria->params = array(':match' => $query);
$models = User::model()->findAll($criteria);
<强>更新强>
如果您使用的是Mysql
,则问题是在where子句中使用此聚合列(fullname)。
如果您只是选择该列(全名)并通过模型中的人工属性获取它,那么可以>>如果您想在where clause
中使用它一个查询,它是不可能的,因为它受MYSQL服务器的限制。这是您将得到的错误:
#1054 - Unknown column 'fullname' in 'where clause'
所以你需要在where子句中重复你的SQL函数(concat)(你不能在where子句中使用别名列)。