У меня есть таблица сотрудников, которая содержит базовую информацию, такую как имя, фамилия и т.д. Каждому сотруднику присваивается уникальный идентификатор.
Затем у меня есть две таблицы: rwh_clock_in
и rwh_clock_out
которые выглядят так:
id (int) 255 PRIMARY A_I
atTime (timestamp) DEFAULT_TIMESTAMP
userid (int) 255
Я пытаюсь выбрать информацию о пользователях из базы данных, а затем также проверить, синхронизирован ли пользователь или нет.
SELECT employee.forename, employee.surname, employee.contactNumber, employee.contactEmail
(CASE WHEN clockin.atTime > clockout.atTime THEN 0 ELSE 1 END) AS 'clockedIn'
FROM rwh_employers employee
LEFT JOIN rwh_clock_in clockin
ON employee.id = employee.id AND employee.id = clockin.userid
LEFT JOIN rwh_clock_out clockout
ON employee.id = employee.id AND employee.id = clockout.userid AND clockin.userid = clockout.userid
WHERE employee.id = 1
Тем не менее, я получаю SQL-ошибку, которая гласит:
1305 - FUNCTION employee.contactEmail не существует
В моей таблице rwh_employers
действительно есть столбец contactEmail
который является VARCHAR (120).
Я думал об этом логично, я не буду знать, был ли пользователь отключен или нет, если я не проверю, есть ли какие-либо строки, которые находятся после atTime
из rwh_clock_in
в rwh_clock_out
. Таким образом, мне нужно сначала проверить любые тайм-ауты от этого пользователя после часов в разы. Если он существует, то пользователь не синхронизируется, если он не выполняется, тогда пользователь синхронизируется.
Любая помощь будет оценена по достоинству.
ОБНОВИТЬ:
SELECT employee.forename, employee.surname, employee.contactNumber, employee.contactEmail, clockin.atTime,
(CASE WHEN clockin.atTime < clockout.atTime THEN clockout.atTime ELSE NULL END) AS 'clockOut'
FROM rwh_employers employee
LEFT JOIN rwh_clock_in clockin
ON employee.id = employee.id AND employee.id = clockin.userid
LEFT JOIN rwh_clock_out clockout
ON employee.id = employee.id AND employee.id = clockout.userid AND clockin.userid = clockout.userid
WHERE employee.id = 1
ORDER BY clockout.atTime ASC LIMIT 1
Теперь clockout
всегда равен NULL, даже когда пользователь отключается
Кажется, вам требуется последнее время для данного пользователя из каждой таблицы. Я бы предложил что-то еще по этим направлениям:
select cio.user_id,
(case when last_ci < last_co then 'checked_out'
else 'checked_in'
end) as which
from (select 1 as user_id,
(select max(atTime) from rwh_clock_in where user_id = 1) as last_ci,
(select max(atTime) from rwh_clock_ou where user_id = 1) as last_co
) cio;
,
) после employee.contactEmail .. это должен бытьemployee.contactEmail, (CASE WHEN clockin.atTime > clockout.atTime THEN 0 ELSE 1 END) AS 'clockedIn'