分别对表的每一行执行两个连接?

时间:2014-08-27 08:57:03

标签: mysql database

我正在构建管理用户出席率的网站的一部分。

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

考勤表只存储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 | +--------+---------+

2 个答案:

答案 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