2013-04-22 123 views
0

我想在CakePHP程序用以下条件进行桌子上的一find('all')查询:cakephp的复杂查找查询示例

1-主键的值等于17

AND

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

AND

3-表中的另一列my_column_id的值是该列my_column_id但比的的主键值的原点my_column_id值越大的所有值的MIN等于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

任何请帮助。

回答

-1

你可以通过在find中传递conditions数组来完成。

$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 
+0

想这已经不工作,我得到一个SQL错误说'SQL错误:1305:函数NAX不存在' – user765368 2013-04-22 03:44:06

+0

@ user765368它应该是'MAX'而不是'NAX' – 2013-04-22 03:45:00

+0

对不起,这个错误实际上是下面的'SQL错误:1111:无效的使用组函数' – user765368 2013-04-22 03:48:08

0

您的where子句中不能使用MySQL聚合函数(MAX,MIN等)。

我认为最简单的方法将是明确包含GROUP BY和使用具有,这样的事情:

$this->Model->find('all', array(
    'group' => 'Model.some_field HAVING MAX(Model.some_field) > 23 
     AND MIN(some_field) < 23' 
)); 

(虽然这没有任何意义,我不觉得!)*

这就像你想要的东西。

托比

更新

[*]我的意思是,我不认为这是有道理进行查询比更大既值少

0

通常,当我有复杂的查询时,我只写出SQL。我不能说速度,我不确定它是否被压低,但你可以试试这个镜头。

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

而且,如果该控制器是模型的外面确保加载正确的模型(将其放置在上面的查询)

$this->loadModel('Model');