私は複雑なドメイン構造を持っています:
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
ます。チーム全体を招待することもできるので、チームを 1 つTeamSession
作成し、チーム メンバーごとに1 つ作成しUserSession
ます。
ここで、クエリを実行したいと思います。まだ実行されていないすべてのスキャンを教えてください (これにより、ユーザーが 1 つ取得するように覚えておくことができます)。この場合、すべてのユーザー セッションを選択し、スキャン 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
ただし、これは機能しません。少なくとも 1 人のユーザーがまだスキャンを実行していない場合、何も返されません。データが何であるかを確認するために句を削除する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 が正しい。マークはスキャンを実行していません。ジョンは #45 をスキャンしました (ジェーンは #46 で、トムは #47 でした)。
where 句を追加するとWHERE sc.user_id=u.id
、正しい 3 つの結果 (スキャン #45、#46、および #47) が得られますが、Mark が見つかりません。最後に掴みたいのはこれだけ!それを変更すると、両方の句WHERE sc.user_id=u.id AND sc.id IS NULL
に (明らかに今) 何も返されません。
スキャンに接続されていないすべてのユーザー セッションを取得するクエリは何ですか?