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

问题描述 投票:0回答:3

我正在尝试为 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 吗?

mysql cakephp aggregate-functions max min
3个回答
2
投票

如果我理解你的意思,你想提出一个请求

  • MIN(游艇.price) 作为 min_price
  • MAX(游艇.价格) 作为 max_price
  • MIN(Yacht.long) 作为 min_length
  • MAX(游艇.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'
     )
    )
);

顺便说一句,根据文档,您的原始代码中似乎有很多冗余。 “find('first', array(...))” 本身确保您只得到一个结果,因此,无需在请求中指定“'limit' => 1”,也无需指定“order”子句,因为无论如何只能是一个领域:)

希望有帮助。


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' => '...'));

0
投票

我最终通过改变搜索方式解决了问题。我没有在会导致连接的条件中进行查询,而是明确地使用 where 进行搜索。我有类似的事情,

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

我用它代替了

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

我必须稍微重组数据库,但速度和数据库规范化之间的权衡是我可以接受的。

© www.soinside.com 2019 - 2024. All rights reserved.