php - 雄辩的子查询是否该行是最新的
问题描述
我有以下子查询:
->whereHas('statuses', function($query){
$query->where('status_id', request('status'));
})->orderBy(...)->paginate();
为简单起见,我隐藏了完整的查询。假设我有数据透视表user_status
。用户有很多状态,一个状态也可以有很多用户(不寻常,我知道。只是作为一个例子)。user_status
因此,当我如上所述查询数据透视表时,我会得到那些具有请求状态 ID 的行。但我还想添加该行必须是该特定用户的最新行(而不是在整个表中)的约束。下面是 user_status 表的样子:
+---------+-----------+---------------------+
| user_id | status_id | created_at |
+---------+-----------+---------------------+
| 1 | 1 | 2018-09-03 18:39:14 |
| 1 | 8 | 2018-09-03 18:51:42 |
+---------+-----------+---------------------+
在这种情况下,如果请求status
的是1
,我不希望返回此行,因为status_id
1 不是 1 的最新行user_id
(请参阅列中的时间差create_at
)。
我怎样才能做到这一点?
解决方案
您可以通过使用带有嵌套查询的另一个条件来实现这一点。
->whereHas('statuses', function($query){
$query->where('status_id', request('status'))
->whereIn('user_status.id', function($query) {
$query->selectRaw('MAX(id)')
->from('user_status')
->groupBy('user_id');
});
})->orderBy(...)->paginate();
嵌套查询将只选择最新的行(假设 user_status.id 是auto-increment
)
推荐阅读
- java - 如何为 JDBC fetch 语句创建可测试的代码
- php - 使用 Laravel (Sockets) 连接两台服务器
- powerbi - DAX:请解释为什么这个带有变量的度量不起作用
- sql - 比较两行中的值并得到 ORA-00918: 列定义不明确
- laravel - 由 Redis 订阅消息触发时,Laravel 作业不会被处理
- r - 如何调整当前散点图代码以匹配 ggplot2 (R) 中的目标散点图?
- aws-lambda - 将代码从 CodePipeline 传递到 PythonFunction
- laravel - Laravel / AWS S3 - 如何验证使用预签名 URL 上传的文件
- apache-superset - 超集图表电子邮件时间表和芹菜节拍时间表。为什么使用 celery beat 时间表而不是图表电子邮件时间表发送报告?
- python - 如何按组过滤出 Pandas DataFrame 行