我想对CakePHP应用程序中的表执行find('all')查询,条件如下:
1-主键值等于17
和
2-表中另一列my_column_id
的值是列my_column_id
的所有值的MAX,但小于其主键的数据的my_column_id
的值值等于17
和
3-表中另一列my_column_id
的值是列my_column_id
的所有值的MIN,但大于其主键的数据的my_column_id
的值值等于17
所以上面的查询应该给我3个结果。
是否可以在一个查询中获取所有这些内容?或者我需要三个单独的查询?
我尝试过类似的事情:
$results = $this->Model->find('all', array(
'conditions' => array(
'MAX(Model.my_column_id) <' => 23,
'Mddel.id' => 17,
'MIN(Model.my_column_id) >' => 23
)
));
23
表示主键等于17的基准的my_column_id
值
但是这给了我以下错误:SQL Error: 1111: Invalid use of group function
请帮助。
答案 0 :(得分:1)
通常,当我有复杂的查询时,我会写出SQL。我不能说速度,我不确定它是否令人不满,但你可以试试这个。
$this->Model->query('
SELECT MAX(table.column),
MIN(table.column)
FROM table
WHERE table.id = '$id'
');
此外,如果此控制器位于模型之外,请确保加载正确的模型(将其置于查询上方)
$this->loadModel('Model');
答案 1 :(得分:0)
您不能在where子句中使用MySQL聚合函数(MAX,MIN等)。
我认为最简单的方法是明确包含GROUP BY并使用HAVING,如下所示:
$this->Model->find('all', array(
'group' => 'Model.some_field HAVING MAX(Model.some_field) > 23
AND MIN(some_field) < 23'
));
(虽然这没有意义,但我不认为!)*
这就像你想要的那样。
托比
<强>更新强>
[*]我的意思是,我认为查询大于和小于值是不合理的!
答案 2 :(得分:-1)
您可以在conditions
内传递find
数组。
示例强>
$this->Model->find('all',array
(
'conditions' => array
(
'Model.field' => 17,
'MAX(Model.field) < ' => 17,
'MIN(Model.field) > ' => 17
)
))
OP评论回复
SQL Error: 1305: FUNCTION NAX does not exist
解决方案:删除函数与括号之间的所有空格或设置sql_mode="IGNORE_SPACE"
;
这导致错误:
SELECT MAX (id) as something FROM Example
这将正常工作:
SELECT MAX(id) as something FROM Example