我正在构建管理用户出席率的网站的一部分。
涉及四个表:用户,出勤(多对多链接)和事件。
考勤表只存储userId和eventId以及他们是否在场,缺席,生病或休假。
我正在尝试创建一个mySQL查询,该查询将显示没有出勤记录的每个用户 - 事件对,即。他们没有被标记为在场,生病等。
我尝试过使用INNER JOIN从用户到出勤,然后从出勤到事件使用RIGHT JOIN,但这必须为每个用户单独执行。我不确定我是否朝着正确的方向前进,或者确定如何在SQL中进行查询迭代。
提前致谢!
更多信息:
用户表
+-----+---------+
| id | name |
+-----+---------+
| 104 | Matthew |
| 102 | Kev |
| 101 | Julia |
+-----+---------+
考勤
+----+--------+---------+------+
| id | userId | eventId | type |
+----+--------+---------+------+
| 16 | 104 | 47 | L |
| 20 | 104 | 46 | L |
| 21 | 104 | 45 | L |
| 22 | 102 | 47 | L |
| 23 | 102 | 46 | L |
| 24 | 102 | 45 | L |
| 28 | 102 | 44 | L |
| 25 | 101 | 47 | L |
| 26 | 101 | 46 | L |
| 27 | 101 | 45 | L |
+----+--------+---------+------+
事件
+----+------------+
| id | date |
+----+------------+
| 43 | 2014-08-01 |
| 44 | 2014-08-08 |
| 45 | 2014-08-15 |
| 46 | 2014-08-22 |
| 47 | 2014-08-29 |
+----+------------+
我的尝试:
SELECT * FROM `user`
INNER JOIN attendance ON user.id=userId
RIGHT JOIN event ON attendance.eventId=event.id
WHERE event.date BETWEEN '2014-08-01' AND CURDATE()
目标
理想情况下,我希望使用userId返回的表和不存在的记录的事件ID。
+--------+---------+
| userId | eventId |
+--------+---------+
| 104 | 43 |
| 104 | 44 |
| 102 | 43 |
| 101 | 43 |
| 101 | 44 |
+--------+---------+
答案 0 :(得分:0)
试试这个:
SELECT a.*,b.type FROM user a right JOIN attendance b ON a.userId =b.userId WHERE a.userId=<your Value> and b.in eventId in (select event Id from Events where event.date BETWEEN '2014-08-01' AND CURDATE())
答案 1 :(得分:0)
我花了一些时间来解决这个问题。我对MySQL不太热,所以我希望这个答案可以改进,但从根本上说,你需要做的是获取不在考勤表中的用户和事件:
<强>查询:强>
SELECT u.id as 'userID', e.id as 'eventID'
FROM event e
JOIN user u
WHERE e.id NOT IN (
SELECT DISTINCT event.id FROM event
INNER JOIN attendance ON attendance.eventId=event.id
WHERE attendance.userId=u.id AND event.date BETWEEN '2014-08-01' AND CURDATE()
)
AND e.date BETWEEN '2014-08-01' AND CURDATE()
ORDER BY u.id DESC;
结果:
+--------+---------+
| userID | eventID |
+--------+---------+
| 104 | 43 |
| 104 | 44 |
| 102 | 43 |
| 101 | 43 |
| 101 | 44 |
+--------+---------+
演示SQL小提琴: http://sqlfiddle.com/#!2/82dd9f/19/0