2014-08-27 42 views
0

我正在建立一个管理用户出勤的网站的一部分。单独在表格的每一行上执行两个连接?

有四个表涉及:用户,出席(多对多链接)和事件。

考勤表只存储userId和eventId以及他们是否在场,缺席,生病或休假。

我正在尝试创建一个mySQL查询,它将显示没有出席记录的每个用户事件对。他们没有被标记为存在,生病等

我曾尝试使用INNER 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() 

目标

理想情况下,我想一个表中不存在的记录的用户id和事件ID返回。

+--------+---------+ | userId | eventId | +--------+---------+ | 104 | 43 | | 104 | 44 | | 102 | 43 | | 101 | 43 | | 101 | 44 | +--------+---------+

+2

发表您的意见,表格结构等所以我们知道你在用什么 – 2014-08-27 09:00:45

+0

这有帮助吗? – Martt 2014-08-27 09:27:56

+0

好多了,欢呼:) – 2014-08-27 09:30:46

回答

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

+0

谢谢!我知道我需要什么,但是专注于连接:D – Martt 2014-08-27 14:44:28

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()) 
相关问题