【发布时间】:2017-09-20 14:05:16
【问题描述】:
我有一个系统,其中可以批准许多项目,并且可以查看每个项目的批准历史记录。一个例子是用户的里程碑,它可以被批准或拒绝。我的数据库书中的表是这样的:
+-----------------+------------------+
| Approvals |
+-----------------+------------------+
| Field | Type |
+-----------------+------------------+
| id | int(10) unsigned |
| approved | tinyint(1) |
| reason | text |
| approvable_id | varchar(191) |
| approvable_type | varchar(191) |
| created_at | timestamp |
| updated_at | timestamp |
+-----------------+------------------+
+----------------------+---------------------------------------+
| Milestones |
+----------------------+---------------------------------------+
| Field | Type |
+----------------------+---------------------------------------+
| id | int(10) unsigned |
| name | varchar(191) |
| created_at | timestamp |
| updated_at | timestamp |
+----------------------+---------------------------------------+
我想要做的是获取接受最后批准的所有里程碑。例如,一个里程碑可能先前已被接受,但后来被拒绝,在这种情况下,此里程碑不应出现在接受的查询中,因为它已被拒绝。
如何仅获取接受最新批准的里程碑?到目前为止,我尝试过的方法是进行exist 子查询,以检查里程碑是否获得批准,即被接受。但是,这也会获取已被接受但后来被拒绝的结果:
SELECT * FROM `milestones`
WHERE EXISTS (
SELECT * FROM `approvals`
WHERE `milestones`.`id` = `approvals`.`approvable_id`
AND `approvals`.`approvable_type` = 'App\Models\Milestone'
AND `created_at` = (
SELECT MAX(created_at) FROM `approvals` AS `sub`
WHERE sub.approvable_id = approvals.approvable_id
AND sub.`approvable_type` = `approvals`.`approvable_type`
AND `sub`.`id` IN (
SELECT `id` FROM `approvals`
WHERE `approved` = 1
)
)
) AND `milestones`.`deleted_at` IS NULL
是否可以抓取所有接受最新批准的里程碑?或者这是否必须在应用程序级别完成?
【问题讨论】:
标签: php mysql sql laravel greatest-n-per-group