0

我想在具有以下条件的 CakePHP 应用程序中的表上执行find('all')查询:

1- 主键值等于 17

2-表中另一列my_column_id的值是该列所有值的最大值my_column_id但小于my_column_id主键值等于17的数据的值

3-表中另一列my_column_id的值是该列所有值的最小值,my_column_id但大于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表示my_column_id主键等于 17 的数据的值

但这给了我以下错误:SQL Error: 1111: Invalid use of group function

请提供任何帮助。

4

3 回答 3

1

通常,当我有复杂的查询时,我只会写出 SQL。我不能说速度,我不确定它是否不受欢迎,但你可以试试这个。

$this->Model->query('
    SELECT MAX(table.column), 
    MIN(table.column) 
    FROM table 
    WHERE table.id = '$id' 
');

此外,如果此控制器在模型之外,请确保加载正确的模型(将其放在查询上方)

$this->loadModel('Model');
于 2013-04-22T13:24:46.130 回答
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'
));

(虽然这没有意义,但我不认为!)*

这就是你想要的。

托比

更新

[*] 我的意思是,我认为查询大于小于一个值是没有意义的!

于 2013-04-22T08:27:30.467 回答
-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
于 2013-04-22T03:39:12.977 回答