mysql - 这可以通过一个 MySQL 查询来完成吗?

标签 mysql join

我有两个表,想要返回 emp 表中所有活跃的员工以及他们从 timeclock 表中工作的任何时间。如果所有活跃员工都在两个日期之间记录了时间,但如果员工在两个日期之间没有记录任何时间,则下面的查询效果很好,则不会返回。我需要所有活跃的员工都返回,无论他们在日期之间是否有时间。

 emp table
 user      active
 jblow          1 
 jdoe           1
 dcook          0
 ajones         1

 timeclock table
 user      date         hours
 jblow     2014-06-01     8.3
 dcook     2013-12-23     7.5
 jdoe      2014-06-03     8.1
 jblow     2014-06-02     7.9
 jblow     2014-05-23     8.0

 SELECT emp.user, emp.active, timeclock.date, timeclock.hours FROM emp JOIN timeclock ON emp.user = timeclock.user AND emp.active = 1 AND timeclock.date BETWEEN "20140601" AND "20140603" ORDER BY emp.user ASC

上面的查询不会返回 ajones,因为他在日期之间没有记录任何时间,但我需要它来返回所有活跃员工。我寻找的结果是这样的:

 ajones  1  null          null
 jblow   1  2014-06-01     8.3
 jblow   1  2014-06-02     7.9
 jdoe    1  2014-06-03     8.1

最佳答案

无论右表值是否匹配,都返回左表值正是LEFT JOIN是为了。

除了在“JOIN”之前添加“LEFT”之外,您还需要将 emp.active = 1 条件从 JOIN 条件移至 WHERE 条件,因为您希望在无论是否有匹配的timeclock记录,都会尝试加入。

SELECT emp.user, emp.active, timeclock.date, timeclock.hours
FROM emp
LEFT JOIN timeclock
  ON emp.user = timeclock.user
  AND timeclock.date BETWEEN "20140601" AND "20140603"
WHERE emp.active = 1
ORDER BY emp.user ASC

SQLfiddle demo

结果:

|   USER | ACTIVE |                        DATE |  HOURS |
|--------|--------|-----------------------------|--------|
| ajones |      1 |                      (null) | (null) |
|  jblow |      1 | June, 02 2014 00:00:00+0000 |    7.9 |
|  jblow |      1 | June, 01 2014 00:00:00+0000 |    8.3 |
|   jdoe |      1 | June, 03 2014 00:00:00+0000 |    8.1 |

关于mysql - 这可以通过一个 MySQL 查询来完成吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24247378/

相关文章:

php - 从 PHP 错误执行 MySQL 查询

mysql - 使用联接表中的条件限制 SUM() 中包含的结果?

cocoa - Cocoa 中等效的 C# 'Thread.Join()' 是什么?

mysql - mysql 的复杂选择查询结合两列与 where 子句

php - 学习如何在 php 和 mysql 中加密密码从哪里开始?

php - MySQL - 字符串索引

MySQL 查询优化 LEFT JOIN 和 DISTINCT

php - 将 MySQL 表保存到本地计算机

mysql - 需要将一个表中的所有数据通过 JOIN 连接到另一个表,并在多个 ROW 上使用多个 AND

mysql - 在一行中合并两个连接值