Mysql запрос выбора из разных таблиц с внутренним объединением - PullRequest
0 голосов
/ 06 марта 2019

Из таблиц tb_user, которая содержит всех пользователей, я пытаюсь объединить другие таблицы, чтобы сопоставить данные для каждого пользователя и выбрать их всех. Но из таблиц tb_work_time столбец over_time содержит несколько данных для каждого пользователя. Я хотел бы выбрать только данные из указанной даты.

Сейчас у меня есть этот код, который не очень хорошо работает. Есть ли способ улучшить это?

SELECT
u.emp_no, u.name, u.position, d.name as dept_name, u.activeYN, (SELECT over_time FROM tb_work_time wt WHERE wt.emp_no = u.emp_no AND wt.work_date = '20190306'),
CASE WHEN ui.updatedTime >= NOW() - INTERVAL 5 minute THEN 'Y' ELSE 'N' END connectYN
FROM tb_user u
INNER JOIN tb_work_time wt ON u.emp_no = wt.emp_no
INNER JOIN tb_user_dept ud ON u.emp_no = ud.emp_no
INNER JOIN tb_dept d       ON ud.dept_id = d.dept_id
INNER JOIN tb_user_info ui ON ud.emp_no = ui.emp_no 

когда я выполняю этот запрос .. результат таков. enter image description here

он просто продолжает искать, а результата нет.

SELECT
u.emp_no, u.name, u.position, d.name as dept_name, u.activeYN, (SELECT over_time FROM tb_work_time wt WHERE wt.emp_no = u.emp_no AND wt.work_date = '20190306') AS over_time,
CASE WHEN ui.updatedTime >= NOW() - INTERVAL 5 minute THEN 'Y' ELSE 'N' END connectYN
FROM tb_user u
INNER JOIN tb_user_dept ud ON u.emp_no = ud.emp_no
INNER JOIN tb_dept d       ON ud.dept_id = d.dept_id
INNER JOIN tb_user_info ui ON ud.emp_no = ui.emp_no 

Я заставил этот код работать. Но это действительно медленно. Есть ли способ сделать это быстрее?

1 Ответ

0 голосов
/ 06 марта 2019

Вот пара запросов, чтобы попробовать. Ни один из них не проверен, потому что в вопросе не было предоставлено выборочных данных.

SELECT
u.emp_no,
u.name,
u.position,
d.name as dept_name,
u.activeYN,
wt.over_time,
CASE WHEN ui.updatedTime >= NOW() - INTERVAL 5 minute THEN 'Y' ELSE 'N' END connectYN
FROM tb_user u
INNER JOIN tb_work_time wt ON u.emp_no = wt.emp_no
INNER JOIN tb_user_dept ud ON u.emp_no = ud.emp_no
INNER JOIN tb_dept d       ON ud.dept_id = d.dept_id
INNER JOIN tb_user_info ui ON ud.emp_no = ui.emp_no
WHERE wt.work_date = '20190306';

Используйте эту версию ниже, если есть вероятность, что emp_no в таблице tb_work_time будет иметь более одной строки на work_date.

SELECT
u.emp_no,
u.name,
u.position,
d.name as dept_name,
u.activeYN,
ot.over_time,
CASE WHEN ui.updatedTime >= NOW() - INTERVAL 5 minute THEN 'Y' ELSE 'N' END connectYN
FROM tb_user u
INNER JOIN (SELECT emp_no, SUM(over_time) AS over_time FROM tb_work_time WHERE work_date = '20190306' GROUP BY emp_no) ot ON u.emp_no = ot.emp_no
INNER JOIN tb_user_dept ud ON u.emp_no = ud.emp_no
INNER JOIN tb_dept d       ON ud.dept_id = d.dept_id
INNER JOIN tb_user_info ui ON ud.emp_no = ui.emp_no;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...