Проверка того, включен или нет пользователь

0

У меня есть таблица сотрудников, которая содержит базовую информацию, такую как имя, фамилия и т.д. Каждому сотруднику присваивается уникальный идентификатор.

Затем у меня есть две таблицы: 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, даже когда пользователь отключается

  • 1
    отсутствует запятая ( , ) после employee.contactEmail .. это должен быть employee.contactEmail, (CASE WHEN clockin.atTime > clockout.atTime THEN 0 ELSE 1 END) AS 'clockedIn'
  • 1
    Вам нужно разделить contactEmail и скобки, иначе это будет считаться функцией.
Показать ещё 4 комментария
Теги:
mysqli

1 ответ

1
Лучший ответ

Кажется, вам требуется последнее время для данного пользователя из каждой таблицы. Я бы предложил что-то еще по этим направлениям:

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;
  • 0
    Я получаю сообщение об ошибке cio.userid не существует в полевой таблице, а идентификатор пользователя не существует в полевой таблице

Ещё вопросы

Сообщество Overcoder
Наверх
Меню