cakephp和mysql中字段的最小值和最大值

时间:2012-07-09 11:28:06

标签: mysql cakephp aggregate-functions max min

我正在尝试为cakephp和mysql站点构建搜索功能。选择不同的参数(如产品价格或长度)会触发ajax调用,该调用返回匹配结果的数量。我想用长度和价格的最小值和最大值来扩展返回的结果。我尝试过这样做,http://bin.cakephp.org/view/1004813660。使用前4个发现太耗时。最后一个在本地运行,但我得到了错误;

1140 - 如果没有GROUP BY子句,混合GROUP列(MIN(),MAX(),...)没有GROUP列是非法的

远程,因为ONLY_FULL_GROUP_BY已开启。

是否可以使用最后一个选项进行一些改进,还是可以关闭ONLY_FULL_GROUP_BY?

3 个答案:

答案 0 :(得分:2)

如果我理解得很好,你想要一次性请求

  • MIN(Yacht.price)为min_price
  • MAX(Yacht.price)as max_price
  • MIN(Yacht.long)为min_length
  • MAX(Yacht.long)为max_length

对吧?

为此,您不需要任何“Group By”子句。 MIN和MAX函数已经是聚合函数。但是没有什么能阻止您在单个请求中使用多个聚合函数。

您是否尝试过这样做?

$stats = $this->Yacht->find(array(
    'conditions' => $conditions,
    'fields' => array(
        'MIN(Yacht.price) as min_price',
        'MAX(Yacht.price) as max_price',
        'MIN(Yacht.long) as min_length',
        'MAX(Yacht.long) as max_length'
     )
    )
);

顺便说一下,根据documentation,原始代码中似乎存在相当多的冗余。 “find('first',array(...))”本身确保只得到一个结果,因此不需要在请求中指定“'limit'=> 1”,也不需要在那里指定“order”子句反正只会是一个领域:)

希望它有所帮助。

答案 1 :(得分:1)

可以在此处找到设置服务器模式的方法...如果您阅读文档的顶部,它将告诉您如何设置服务器模式默认值:

http://dev.mysql.com/doc/refman/5.1/en/server-sql-mode.html

但是,我不确定是否有必要找到您的解决方案。我认为您的查询已运行很长时间,因为您需要在代码中使用不同的组并减少查询。您应该能够使用逻辑组来最大化您的主键(索引):

'group' => 'Yacht.id'

所以你有一个查询返回所有内容:

$this->Yacht->find('first', array(
'conditions' => $conditions,
'fields' => array('MAX(Yacht.price) as max_price', 'MIN(Yacht.price) as min_price', ...)
'group' => 'Yacht.id'
'order' => '...'));

答案 2 :(得分:0)

我最终通过改变我的搜索方式来解决问题。我没有在导致连接的条件下进行查询,而是明确地在哪里进行搜索。我有类似的东西,

$conditions = array('Brand.name LIKE'=> '%bla%');

我将其替换为

 $condtions = array('Yacht.brand_name LIKE' => '%bla%');

我不得不对数据库进行一些重构,但是速度和数据库规范化之间的权衡是我可以接受的。