Mysql Foreach с одного стола на другой - PullRequest
1 голос
/ 22 октября 2019

У меня есть 2 таблицы, первая таблица - пользовательская, а вторая таблица - user_attendance.

В посещаемости пользователя я вставляю IN и OUT для каждой строки, поэтому 1 строка для IN и 1 строка для OUT.

Я хочу выбрать MySQL (так что мне не нужно делать это на Php), который будет зацикливаться для каждого идентификатора пользователей и получать последние OUT и первые IN этого пользователя в пользовательской таблице.

Я попытался сделать это на Php, выбрав сначала все идентификаторы в пользователе и зациклив его через php и выбрав 1-й вход и последний из этого идентификатора в посещаемости. Вот так.

$userCreds = DB::table('users')->select('user_id', 'username')->get();

$emailBody = '<table border="1"><thead><tr><th>Employee ID</th><th>Employee Name</th><th>Date</th><th>IN</th><th>OUT</th></tr></thead><tbody>';

        foreach ($userCreds as $userCred) {
           $userAttendance = DB::select( 
                            DB::raw(
                                "SELECT username,
                                    (
                                        SELECT TIME_FORMAT(time(b.server_time), '%r')
                                        FROM `users` a
                                        LEFT JOIN user_attendance b
                                        ON a.user_id = b.user_id
                                        WHERE a.user_id = $userCred->user_id
                                        AND (b.server_time between '$ysDate' and '$yeDate')
                                        AND b.action = 'IN' ORDER BY b.server_time ASC LIMIT 1
                                    ) as TimeIn,
                                    (
                                        SELECT TIME_FORMAT(time(b.server_time), '%r')
                                        FROM `users` a
                                        LEFT JOIN user_attendance b
                                        ON a.user_id = b.user_id
                                        WHERE a.user_id = $userCred->user_id
                                        AND (b.server_time between '$ysDate' and '$yeDate')
                                        AND b.action = 'OUT' ORDER BY b.server_time DESC LIMIT 1
                                    ) as TimeOut
                                FROM users
                                WHERE user_id = $userCred->user_id"
                            )
                        ); 

            $emailBody .= '<tr><td>'.$userCred->user_id.'</td><td>'.$userCred->username.'</td><td>'.date('Y-m-d',(strtotime ( '-1 day' , strtotime ( $date) ) )).'</td><td>'.$userAttendance[0]->TimeIn.'</td><td>'.$userAttendance[0]->TimeOut.'</td></tr>';
        }

Вместо того, чтобы делать это на Php, я хочу, чтобы это было сделано на стороне Mysql, чтобы я мог на самом деле создать представление, которое будет сохраняться когда-либо сейчас и сделано для целей записи.

Что мне нужно, так это

таблица пользователей

user_id |имя пользователя

01 |поросёнок

02 |Пух

03 |тигр

таблица user_attendance

user_id |серверное время |действие

01 |2019-10-10 08:00:00 |IN

01 |2019-10-10 09:00:00 |OUT

01 |2019-10-10 10:00:00 |IN

01 |2019-10-10 18:00:00 |OUT

02 |2019-10-10 07:45:00 |IN

02 |2019-10-10 09:00:00 |OUT

02 |2019-10-10 10:00:00 |IN

02 |2019-10-10 19:50:00 |OUT

Результат будет

user_id |дата |IN |OUT

01 |2019-20-10 |08:00:00 |18: 00: 00

02 |2019-20-10 |07:45:00 |19: 50: 00

1 Ответ

1 голос
/ 22 октября 2019

Вот рефакторированный запрос sql.

Первый - получить таблицу пользователей. Второй - присоединение. IN Время. Третье - присоединиться к OUT. Четвертое - получить max() иmin() время идентификатора пользователя, затем группировать по a.user_id.

SELECT a.user_id, TIME_FORMAT(time(min(b.server_time)), '%r') as TimeIn, TIME_FORMAT(time(max(c.server_time)), '%r') as TimeOut
FROM `users` a
LEFT JOIN user_attendance b ON a.user_id = b.user_id and (b.server_time between '$ysDate' and '$yeDate') and b.action = 'IN'
LEFT JOIN user_attendance c ON a.user_id = c.user_id and (c.server_time between '$ysDate' and '$yeDate') and c.action = 'OUT'
GROUP BY a.user_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...