Laravel Inner присоединяется к последнему значению правой таблицы

Я пытаюсь получить последнее значение журнала входа моего пользователя, но не могу сделать это с помощью этого кода:

DB::table('users')
    ->leftJoin('login_logs', 'login_logs.id', '=', function($query) {
        $query->select('login_logs.id')
            ->where('users.id', '=','login_logs.user_id')
            ->orderBy('login_logs.created_at')
            ->limit(1);
    })->get();

У меня есть 2 таблицы пользователей и журнал входа. Я хочу получить всех пользователей с последним журналом входа. Может кто-нибудь мне помочь? Я новичок в Laravel.

Редактировать: я получил этот код для sql:

SELECT c.*, o.* 
FROM users c 
INNER JOIN login_logs o ON o.id = (
SELECT id 
FROM login_logs 
WHERE login_logs.users_id = c.id 
ORDER BY id DESC 
LIMIT 1)

Edit2: этот код работает для меня

DB::table('users')
->leftJoin('login_logs', 'login_logs.id', '=', (DB::RAW('(
SELECT id FROM login_logs 
WHERE login_logs.user_id = users.id 
ORDER BY login_logs.id DESC 
LIMIT 1)')))
->select('users.*','login_logs.created_at as lastLogin','login_logs.type')
->get()

какие-нибудь лучшие идеи ?:

Вы знакомы с моделями и отношениями Eloquent?

Jonas Staudenmeir 14.06.2018 01:07

Я использую таблицы данных github.com/yajra/laravel-datatables, и это не работает с моделями :(

Jarloyz Juarez 14.06.2018 18:25
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
2
849
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Попробуйте что-то вроде этого:

DB::table('users')
            ->join('login_logs', 'login_logs.user_id', '=', 'users.id')
            ->order_by('login_logs.id', 'desc')
            ->first();

он возвращает только один, я хочу вернуть всех пользователей с последней датой входа в систему

Jarloyz Juarez 14.06.2018 18:26

удалить -> первый ()

Shoukat Mirza 19.11.2018 09:11
Ответ принят как подходящий

Чтобы получить последнюю запись из таблицы журнала входа в систему для каждого пользователя, вы можете использовать следующий самосоединенный запрос

select u.*, l.*
from users u
join login_logs l on u.id = l.user_id
left join login_logs l1 on l.user_id = l1.user_id
and l.created_at < l1.created_at
where l1.user_id is null

Используя построитель запросов, вы можете переписать его как

DB::table('users as u')
  ->select('u.*', 'l.*')
  ->join('login_logs as l', 'u.id', '=', 'l.user_id')
  ->leftJoin('login_logs as l1', function ($join) {
        $join->on('l.user_id', '=', 'l1.user_id')
             ->whereRaw(DB::raw('l.created_at < l1.created_at'));
   })
  ->whereNull('l1.user_id')
  ->get();

Laravel Eloquent выбирает все строки с max created_at

Laravel - получить последнюю запись каждого типа UID

Группа Laravel Eloquent по последней записи

спасибо за ответ, это мой sql-код, работающий SELECT c. *, o. * FROM users c INNER JOIN login_logs o ON o.id = (SELECT id FROM login_logs WHERE login_logs.users_id = c.id ORDER BY id DESC LIMIT 1 ) как я могу использовать его в laravel?

Jarloyz Juarez 14.06.2018 18:33

@JarloyzJuarez, почему вы хотите запустить этот запрос вместо того, что я указал в своем ответе, попробуйте и позвольте мне, если вы все еще не получаете нужные данные или в случае ошибки

M Khalid Junaid 14.06.2018 23:47

извините за это, ваш код не работает, код возвращает весь журнал входа для каждого пользователя

Jarloyz Juarez 15.06.2018 00:50

@JarloyzJuarez Я сомневаюсь, что это не может быть правдой.Также вы можете оказать нам услугу и включить образец набора данных для ваших таблиц и определений таблиц с помощью sqlfiddle.com или любого другого онлайн-инструмента, или, возможно, вы можете добавить в свой вопрос, чтобы я могу проверить то, что вы сказали правильно или нет

M Khalid Junaid 15.06.2018 00:53

о, ребята, извините, я вижу свою ошибку, некоторые из моих журналов данных имеют такое же datetime, и это было причиной того, почему ваш запрос не работал, я исправил изменение идентификатора l.created_at <l1.created_at для l.id <l1.id Большое спасибо

Jarloyz Juarez 15.06.2018 17:48

Попробуйте этот код. Внутренний запрос предоставит информацию о вашем последнем входе в систему каждого пользователя и присоединится к нему по таблице (Id) с LEFT JOIN. Таким образом, он ответит только на необходимые данные вашего пользователя. Вы можете добавить, наконец, WHERE CONDITION, чтобы получить информацию о конкретном идентификаторе (пользователя)

SELECT U.ID,
    LOGS.CREATED_AT
FROM USERS AS U
    LEFT JOIN
        (
            SELECT ID,
                MAX(CREATED_AT) AS CREATED_AT
            FROM LOGIN_LOGS
            GROUP BY ID
        ) AS LOGS
    ON  LOGS.ID = U.ID
--WHERE U.ID='your_user_id'

Надеюсь, что это поможет вам.

спасибо за ответ, у меня этот код работает SELECT c. *, o. * FROM users c INNER JOIN login_logs o ON o.id = (SELECT id FROM login_logs WHERE login_logs.users_id = c.id ORDER BY id DESC LIMIT 1)

Jarloyz Juarez 14.06.2018 18:35

ORDER BY замедлит ваш запрос. В настоящее время, возможно, вы работаете с Test Data. Но отсутствие данных снизит вашу производительность в соотношении 30:70.

Irfan 15.06.2018 02:35

спасибо за ответ, что вы думаете по этому поводу? ВЫБРАТЬ c. *, O. * ИЗ пользователей c ВНУТРЕННЕЕ СОЕДИНЕНИЕ login_logs o ON o.id = (ВЫБРАТЬ MAX (id) FROM login_logs ГДЕ login_logs.user_id = c.id ГРУППА ПО login_logs.user_id);

Jarloyz Juarez 15.06.2018 17:58

в настоящее время вы собираетесь делать 3 шага ▼ usres [id] → login_logs [id] → login_logs [user_id]. Я даю вам ярлык, чтобы действовать быстро. ▲ usres [u_id] → login_logs [u_id]. Теперь вы выбираете, что кажется лучше.

Irfan 16.06.2018 05:47

Другие вопросы по теме