【问题标题】:Mysql query select from different tables with inner joinMysql查询从具有内连接的不同表中选择
【发布时间】:2019-03-06 02:08:29
【问题描述】:

从包含所有用户的 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 

当我执行这个查询时.. 结果是这样的。

它只是不停地搜索,没有结果。

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 

我已经让这段代码工作了。但这真的很慢。有没有办法让它更快?

【问题讨论】:

  • 哪方面不好用?
  • @nick 执行查询后,一直在搜索,没有得到结果

标签: mysql inner-join


【解决方案1】:

这里有几个查询可供尝试。这些都没有测试,因为问题中没有提供样本数据。

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

如果tb_work_time 表中的emp_no 有可能每个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;

【讨论】:

    猜你喜欢
    • 2020-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-27
    • 1970-01-01
    • 2014-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多