繁体   English   中英

Laravel 查询生成器的 SQL 子查询 JOIN 问题

[英]SQL Subquery JOIN issue with Laravel Query Builder

我想我一直在理解 Laravel Query Builder 和纯 SQL 之间融合的东西。

我有 2 张桌子:

  • 用户:包含具有主键user_id用户
  • User_Action :这是一个包含由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

我的需要

现在我想检索一个用户列表,每个用户都有最新的操作。 所以我只需要在从useruser_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM