2014-08-27 43 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()) 
相關問題