好的经过几个小时的研究并仍在使用DB :: select我不得不问这个问题 . 因为我即将把我的电脑拉下来;) .
我想得到用户的最后一个输入(基于时间戳) . 我可以使用原始sql执行此操作
SELECT c.*, p.*
FROM users c INNER JOIN
(
SELECT user_id,
MAX(created_at) MaxDate
FROM `catch-text`
GROUP BY user_id
) MaxDates ON c.id = MaxDates.user_id INNER JOIN
`catch-text` p ON MaxDates.user_id = p.user_id
AND MaxDates.MaxDate = p.created_at
我从stackoverflow上的另一个帖子here得到了这个查询 .
我已尝试使用Laravel中的流畅查询构建器完成所有操作,但没有成功 .
我知道手册说你可以这样做:
DB::table('users')
->join('contacts', function($join)
{
$join->on('users.id', '=', 'contacts.user_id')->orOn(...);
})
->get();
但这没有多大帮助,因为我不知道如何在那里使用子查询?谁可以点亮我的一天?
5 回答
对你们所有人来说,绝望地到达这里寻找同样的问题 . 我希望你能比我更快找到它; O.
这是如何解决的 . JoostK在github告诉我“加入的第一个参数是你加入的表格(或数据) . ”而他是对的 .
这是代码 . 不同的表和名称,但你会得到这个想法吗?它
我正在寻找一个相关问题的解决方案:找到每组的最新记录,这是N = 1的典型greatest-n-per-group的特化 .
解决方案涉及您在此处理的问题(即,如何在Eloquent中构建查询),因此我发布它,因为它可能对其他人有帮助 . 它演示了一种更简洁的子查询构造方式,使用功能强大的Eloquent流畅接口和多个连接列以及连接子选择内的
where
条件 .在我的示例中,我想获取由
watch_id
标识的每个组的最新DNS扫描结果(表scan_dns
) . 我分别构建子查询 .我希望Eloquent生成的SQL:
我是通过以下方式完成的:
更新:
自Laravel 5.6.17以来,添加了sub-query joins,因此有一种本机方式来构建查询 .
在Laravel中查询子查询
我想你要找的是"joinSub" . 它得到laravel ^ 5.6的支持 . 如果您使用低于5.6的laravel版本,您还可以在应用服务提供商文件中将其注册为宏 . 喜欢这个https://github.com/teamtnt/laravel-scout-tntsearch-driver/issues/171#issuecomment-413062522
我无法评论,因为我的声誉不够高 . @Franklin Rivero如果您使用的是Laravel 5.2,则可以使用setBindings方法在主查询而不是连接上设置绑定 .
所以@ ph4r05的答案中的主要查询看起来像这样: