[英]SQL Subquery JOIN issue with Laravel Query Builder
我想我一直在理解 Laravel Query Builder 和纯 SQL 之间融合的东西。
我有 2 张桌子:
user_id
用户user_id
和操作的datetime
组成的 PRIMARY KEY 的记录的表。前任:
用户
user_id
1
用户操作
user_id datetime action_type
1 2017-12-01 12:10:00 y
1 2017-12-01 12:00:00 x
我的需要:
现在我想检索一个用户列表,每个用户都有最新的操作。 所以我只需要在从user
到user_action
的 JOIN 中获取 1 行,并且这一行必须是具有最新日期时间的行。 所以在我的前任中; 我2017-12-01 12:10:00
使用 LEFT JOIN 获取日期时间为2017-12-01 12:10:00
的记录(即使没有操作也可以检索用户)。
我尝试了以下方法:
$userActionSubquery = DB::table('user_action')
->select()
->orderBy('datetime', 'DESC')
->limit(1);
$query->leftJoinSub($userActionSubquery, 'user_action', function ($join) {
$join->on('user_action.user_id', '=', 'user.user_id');
})->groupBy('user_id');
通过这样做,我没有从user_action
表中得到任何信息,但是如果给定用户的操作是表中最新的,它就可以工作! 我认为$join->on
会过滤用户 ID,但 JOIN 子查询在没有这个过滤器的情况下运行,我只能在子查询中使用 WHERE,因为我没有 user_id 给! 这是获取用户列表的查询!
PS:生成的查询是
SELECT user.user_id FROM user left join (SELECT * FROM user_action ORDER BY datetime DESC LIMIT 1) as user_action on user_action.user_id = user.user_id WHERE user.tenant_id in ('7') GROUP BY `user_id`
我错过了一些成功的东西,谢谢你的帮助!
尝试这个:
$sub = \DB::table('user_action')
->select([
'user_id',
\DB::raw('SUBSTRING_INDEX( GROUP_CONCAT( action_type ORDER BY datetime DESC ), ",", 1 ) AS last_action_type')
])
->groupBy('user_id');
$data = \DB::table('user')
->leftJoinSub($sub, 'tmp', function ($join) {
$join->on('tmp.user_id', '=', 'user.id');
})->get();
sql:
SELECT * FROM user LEFT JOIN ( SELECT user_id, SUBSTRING_INDEX( GROUP_CONCAT( action_type ORDER BY datetime DESC ), ',', 1 ) AS last_action_type FROM user_action GROUP BY user_id ) AS tmp ON tmp.user_id = user.id
它适用于我的测试环境:
用户
id name
1 john
2 jack
用户操作
id user_id datetime action_type
1 1 2020-09-24 23:51:00 login
2 1 2020-09-24 23:51:20 search
3 2 2020-09-24 23:30:00 login
4 2 2020-09-25 00:00:00 coding
结果
Illuminate\Support\Collection Object
(
[items:protected] => Array
(
[0] => stdClass Object
(
[id] => 1
[name] => john
[user_id] => 1
[last_action_type] => search
)
[1] => stdClass Object
(
[id] => 2
[name] => jack
[user_id] => 2
[last_action_type] => coding
)
)
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.