我有一個複雜的域結構:會話<>掃描:獲取所有掃描還未執行
User: id, name, email
Team: id, name
UserTeam: id, user_id, team_id
Session: id, data
UserSession: id, user_id, session_id
TeamSession: id, team_id, session_id
Scan: id, user_id, session_id, test_data
我可以邀請用戶採取了「會話」。用戶可以參加一個會話(其中一個爲UserSession
),如果完成,結果將存儲在Scan
中。我還可以邀請一個完整的團隊,因此創建一個TeamSession
,併爲每個團隊成員創建一個UserSession
。
現在我想執行查詢:給我所有尚未執行的掃描(所以我可以記住用戶採取一個)。對於這種情況,我想選擇所有用戶版本並加入掃描其中掃描ID爲NULL
。我認爲這是從連接表中找出一行的方式還沒有出現。
這是我的查詢:
SELECT us.id as userSessionId,
sc.id as scanId,
s.id as sessionId,
u.id, u.name
FROM usersessions us
LEFT JOIN sessions s ON us.session_id = s.id
LEFT JOIN scans sc ON us.session_id = sc.session_id
LEFT JOIN users u ON us.user_id = u.id
WHERE sc.id IS NULL
GROUP BY us.id
但是,它不工作:當至少一個用戶未進行掃描卻什麼都不會返回。如果我刪除WHERE
子句看到的數據是什麼,我得到這個回:
userSessionId scanId sessionId id name
45 45 39 39 John
46 45 39 40 Jane
47 45 39 41 Tom
48 45 39 42 Mark
在這種情況下,都是在同一組,並得到了一個會話(#39)。他們的用戶ID和用戶會話ID是正確的。 Mark尚未執行掃描。約翰確實掃描了#45(簡爲#46,湯姆#47)。
如果我添加where子句WHERE sc.user_id=u.id
,我會得到正確的三個結果(掃描#45,#46和#47),但是Mark缺失。這是我最想抓住的唯一一個!如果你改變它然後到兩個條款WHERE sc.user_id=u.id AND sc.id IS NULL
它(顯然現在)再次沒有返回。
如何查詢所有用戶會話未連接到掃描?
因此,我假設'掃描'表中的'id'字段不是自動遞增的(可以重複),而且這些列在'id - > user_id - > session_id'的組合中是正確的?每個會話可以有多個掃描嗎? – 2012-07-13 21:51:11
掃描ID是自動增量的,如果每個會話有多個用戶,則每個會話只有*多個掃描。與一個用戶的會話有一個用戶會話和一個掃描。 – 2012-07-13 22:09:54
好的,一個用戶會話可以存在,但沒有相應的'掃描',並且你想要那些沒有相應掃描的用戶職位(不完整) - 以及與之不一致的scanid是否正確? – 2012-07-13 22:15:09