cakephp complex查找查询示例

时间:2013-04-22 03:29:56

标签: php sql cakephp cakephp-1.3

我想对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

请帮助。

3 个答案:

答案 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