我在cake php 2.1中有以下代码。我尝试获取唯一字符串消息的列表,删除所有重复项。
$this->loadModel('ErrorMessage');
$this->ErrorMessage->recursive = -1;
$error_messages = $this->ErrorMessage->find('list',
array(
'fields' => array('DISTINCT message'),
)
);
产生以下错误:
错误:SQLSTATE [42000]:语法错误或访问冲突:1064您 您的SQL语法有错误;检查对应的手册 您的MySQL服务器版本,以便在'DISTINCT附近使用正确的语法
ErrorMessage. message
FROMintermatte
。error_messages
AS 第1行的“ErrorMes”SQL查询:SELECT
ErrorMessage
。id
,DISTINCTErrorMessage. message
FROMintermatte
。error_messages
ASErrorMessage
WHERE 1 = 1
有趣的部分是在查询中产生的; Cake已自动包含id字段!
我单独测试查询,它产生预期的结果:(唯一字符串列表)
SELECT DISTINCT message FROM error_messages;
以下是创建表供参考:
CREATE TABLE `error_messages` (
`id` INT(10) NOT NULL AUTO_INCREMENT,
`message` MEDIUMTEXT NULL COLLATE 'utf8_unicode_ci',
`figure` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci',
`created` DATETIME NULL DEFAULT NULL,
`modified` DATETIME NULL DEFAULT NULL,
PRIMARY KEY (`id`),
)
COLLATE='utf8_unicode_ci'
ENGINE=InnoDB
ROW_FORMAT=COMPACT;
所以问题是,为什么蛋糕自动包含id字段,我怎么能告诉蛋糕不要这样做?
我当然可以使用查询,但这不是'好'。 ;)
答案 0 :(得分:0)
是的,CAKEPHP会这样做,你可以做的是使用GROUP BY子句来克服这个问题,
$error_messages = $this->ErrorMessage->find('list', array(
'fields'=>'message',
'group' => 'message'));
答案 1 :(得分:0)
Cake会始终将ID包含在'列表中。查询,除非您在'字段中指定两个字段'部分查询。如果在没有任何字段规范的情况下运行该查询,则默认情况下返回的结果将采用以下格式:
array(
'Model.id' => 'Model.name'
)
(除非您已覆盖模型中的默认displayName。)
在查询中指定两个不包含id的字段,例如
'fields' => array('ErrorMessage.message', 'ErrorMessage.message')
这将返回格式为:
的数组array(
'Errormessage.message' => 'ErrorMessage.message'
)
要仅获取唯一消息,请使用GROUP BY:
'group' => array('ErrorMessage.message')