MySQL查询从具有内部联接的不同表中选择

时间:2019-03-06 02:08:30

标签: mysql inner-join

从包含所有用户的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 :(得分:0)

这里有几个查询可以尝试。由于问题中没有提供样本数据,因此均未测试。

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_timework_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;