mysql - cakephp 在 MAX() 上设置条件

标签 mysql cakephp

我需要过去 30 天内最多提交的订单。 max 字段是一个 virtualField。

public $virtualFields = array(
        'max_submitted' => "MAX(`WorkRecord`.`submitted`)"
    );

I get error #1054 - Unknown column 'WorkRecord.max_submitted' in 'field list' 


SELECT `WorkRecord`.`id`, `Order`.`fee`, `Order`.`order_id`, 
       `Order`.`min_sources`, `Order`.`min_references`, `Order`.`am_level`,
       `Order`.`am_standard`, `Order`.`am_type`, `Order`.`am_subject`, `Order`.`am_word_count`,
       `Order`.`ref_style`, `Order`.`service`, `BriefInstalment`.`deadline`, 
       `BriefInstalment`.`id`, (MAX(`WorkRecord`.`submitted`)) AS `WorkRecord__max_submitted` 
FROM `writers`.`work_records` AS `WorkRecord` 
RIGHT JOIN `torg`.`temp_orders` AS `Order` ON (`Order`.`order_id` = `WorkRecord`.`order_id` AND `Order`.`status2` > 2 AND `Order`.`am_type` NOT LIKE '%phd%') LEFT JOIN `writers`.`brief_instalments` AS `BriefInstalment` ON (`WorkRecord`.`brief_instalment_id` = `BriefInstalment`.`id`) 
WHERE `WorkRecord`.`writer_id` = 7827 
       AND `WorkRecord`.`withdrawn` IS NULL 
       AND `WorkRecord`.`max_submitted` BETWEEN NOW() - INTERVAL 30 DAY AND NOW() GROUP BY `Order`.`order_id`

最佳答案

您不能在 where 子句中使用聚合函数结果,因为当使用 where 子句时,聚合结果(例如 max())将不可用正在应用中。

将 max() 移至 `having:

SELECT ..., max(foo) AS foo
FROM ...
WHERE ...
HAVING foo BETWEEN ...

having 基本上是在结果通过客户端发送之前的最后一步。到那时,所有计算/聚合都已完成。

关于mysql - cakephp 在 MAX() 上设置条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27447975/

相关文章:

cakephp - 如何在CakePHP中的两个连接表中按条件查找

php - cakephp 使用组件作为 Controller 方法

html5 视频流

php - cakePHP发送的电子邮件,如何在变量中设置管理员电子邮件地址?

CakePHP Auth 组件在登录前检查用户

php - 使用 password_hash() 和 password_verify() 的问题

php - 对数据库中所有表的字段求和

PHP 从数组构建语句

mysql - 用于获取工作日的单个数据库查询(mysql)

python - 缓存通过 API 获取的在线价格,除非它们发生变化