当存在多个状态时,如何对第一个状态做筛选

问题

一个商品存在上线流程,如订购、物流、入库、上架。
在表中有多个记录表示相应的时间节点流程。

现在有需求如,筛选出所有目前状态为物流中的商品。

目前表结构

  1. 商品表
  2. 流程表,流程表关联商品表,最新一条记录表示商品当前状态

实现存在的问题

使用联表查询时存在一定问题,不知道怎么表达筛选出所有数据中子表内容最近一条必须为1的记录。

尝试了

$q->whereHas('follow', function ($q) use ($request){
  $q->latest()->limit(1)->where('state', $request->get('state'));
});

$q->whereHas('follow', function ($q) use ($request){
  $q->where('state', $request->get('state'))->where('dispatch_id', clone($q)->latest()->first()->dispatch_id);
});

前者无效后者报错。。

目前解决方案是

  1. 在主表中维护状态字段
  2. 通过访问器定义一个字段

想问下大家有其他的解决的方法吗

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 7

ROW_NUMBER():将数据内部分组后组内数据进行编号

说明:我只是之前见过这东西,以及刚才测试了一下,没有实际使用过

假设表结构为 products: id, product, state, updated_at

SELECT `id`, `product`, `state`, `updated_at`
FROM (
    SELECT `id`, `product`, `state`, `updated_at`,
    ROW_NUMBER() OVER ( PARTITION BY `product` ORDER BY `updated_at` DESC ) AS `row_num`
    FROM `products`
) products_time
WHERE
    `row_num` =1 and `state` = 1

参考链接:MySQL ROW_NUMBER

2周前 评论
Error_404 (楼主) 2周前
zhaojjiang (作者) 2周前
陈先生 2周前
giao哥
2周前 评论
giao哥

首先:

SELECT MAX(id) AS id,gid FROM  liuchengbiao where state = "物流" GROUP BY gid LIMIT 20 offset 0; 

得到商品ID,然后

select * from goods where gid in(gid.....)
2周前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!