Cake PHP自动将id字段添加到sql查询

Cake PHP自动将id字段添加到sql查询,php,mysql,sql,cakephp,distinct,Php,Mysql,Sql,Cakephp,Distinct,我在PHP2.1中有以下代码。我尝试获取唯一字符串消息的列表,删除所有重复项 $this->loadModel('ErrorMessage'); $this->ErrorMessage->recursive = -1; $error_messages = $this->ErrorMessage->find('list', array( 'fields' => array('DISTINCT message'), ) ); 这将产生以下错误:

我在PHP2.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。消息
FROM
intermate
错误消息
AS `1号线的“错误”

SQL查询:选择
ErrorMessage
id
,不重复
ErrorMessage。
消息
FROM
intermate
error\u消息
AS
ErrorMessage
其中1 =1

有趣的部分在生成的查询中;蛋糕已自动包含id字段

我单独测试查询,它生成预期结果:(唯一字符串列表)

以下是创建表格以供参考:

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;
所以问题是,为什么cake会自动包含id字段,我如何告诉cake不要这样做


我当然可以使用查询,但这不是“好的”。)

是的,CAKEPHP可以做到这一点,您可以使用GROUP BY子句来解决这个问题

$error_messages = $this->ErrorMessage->find('list', array(
                                                'fields'=>'message',
                                                'group' => 'message'));

除非在查询的“字段”部分指定了两个字段,否则Cake将始终在“列表”查询中包含id。如果在没有任何字段规范的情况下运行该查询,默认情况下,返回的结果将采用以下格式:

array(
    'Model.id' => 'Model.name'
)
(除非已覆盖模型中的默认displayName)

在查询中指定两个不包含id的字段,例如

'fields' => array('ErrorMessage.message', 'ErrorMessage.message')
这将返回以下格式的数组:

array(
    'Errormessage.message' => 'ErrorMessage.message'
)
要仅获取唯一消息,请使用分组方式:

'group' => array('ErrorMessage.message')

谢谢gazareth,我在这里也发现了一个类似的帖子:这个答案谈到使用Set类删除重复项。注意,最好使用Hash类而不是Set-它更快更好。
'group' => array('ErrorMessage.message')