Вложенный запрос SQL присоединяюсь к вопросу с Laravel построитель запросов


Вложенный запрос SQL присоединяюсь к вопросу с Laravel построитель запросов

24.09.2020 11:59:57 Просмотров 9 Источник

Я застрял в понимании чего-то расплавленного между Laravel Query Builder и чистым SQL, я думаю.

У меня есть 2 стола :

  • Пользователь : содержит пользователей с первичным ключом user_id
  • User_Action : это таблица, содержащая записи с составленными первичными ключами user_id и datetime действия.

экс:

пользователь

user_id
1

действие пользователя

user_id    datetime              action_type
1          2017-12-01 12:10:00   y
1          2017-12-01 12:00:00   x

Моя потребность :

Теперь я хочу получить список пользователей с новейшим действием для каждого пользователя. Поэтому мне нужно получить только 1 строку в соединении от user до user_action, и эта строка должна быть самой новой датой и временем. Так что в моем бывшем; я хотел бы получить только запись с datetime 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, но это работает, если действие данного пользователя является самым новым в таблице ! Я думал, что user_id0 будет фильтровать идентификатор пользователя, но подзапрос JOIN выполняется без этого фильтра, и я не могу не указать WHERE в подзапросе, потому что у меня нет идентификатора пользователя ! это запрос, чтобы получить список пользователей !

PS : сгенерированный запрос таков

user_id1

Мне не хватает чего-то, чтобы добиться успеха, спасибо за вашу помощь!

У вопроса есть решение - Посмотреть?

Ответы - Вложенный запрос SQL присоединяюсь к вопросу с Laravel построитель запросов / SQL Subquery JOIN issue with Laravel Query Builder

Является ответом!
CloudyCity

24.09.2020 07:21:53

Попробовать это:

$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

Это работает в моем тестовом env:

пользователь

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
                )

        )

)
Помочь в развитии проекта:
Закрыть X