![](/img/trans.png)
[英]MySQL: Selecting one row per unique column value using another column as priority/order
[英]Limit one row per unique column value selecting by max column value
我正在尝试为每个Customer
选择最新的WorkOrder
。 我使用过ORDER BY
和GROUP BY
,但是返回的结果不是最新的WorkOrder
。
表结构:
WorkOrder
id
customer_id
create_date
...
样本数据:
WorkOrder.id WorkOrder.customer_id WorkOrder.create_date ...
1 1 2012-01-01 12:00:00
2 1 2016-06-29 12:00:00
3 2 2015-05-05 12:00:00
所需结果:
WorkOrder.id WorkOrder.customer_id WorkOrder.create_date ...
2 1 2016-06-29 12:00:00
3 2 2015-05-05 12:00:00
当前代码:
$query = DB::table('WorkOrder')
->orderBy('WorkOrder.create_date', 'desc')
->groupBy('WorkOrder.customer_id');
// select * from `WorkOrder` group by `WorkOrder`.`customer_id` order by `WorkOrder`.`create_date` desc
当前结果:
WorkOrder.id WorkOrder.customer_id WorkOrder.create_date ...
1 1 2012-01-01 12:00:00
3 2 2015-05-05 12:00:00
使用最大功能
SELECT WorkOrder.id, WorkOrder.customer_id, MAX(WorkOrder.create_date) FROM `WorkOrder` GROUP BY `WorkOrder`.`customer_id` ORDER BY `WorkOrder`.`create_date` DESC
尝试这个:
SELECT * FROM WorkOrder
WHERE (customer_id, create_date) IN
(SELECT customer_id, MAX(create_date) FROM WorkOrder
GROUP By customer_id)
ORDER BY ...
我倾向于使用相关的子查询来做到这一点:
select wo.*
from workorder wo
where create_date = (select max(wo2.create_date)
from workorder wo2
where wo2.customer_id = wo.customer_id
);
与在子查询中使用group by
相比,该方法的优势在于:
where
子句中有其他过滤器,则只会在减少的行集中查找值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.