1

私は複雑なドメイン構造を持っています:

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に (明らかに今) 何も返されません。

スキャンに接続されていないすべてのユーザー セッションを取得するクエリは何ですか?

4

2 に答える 2

1

GROUP BYクエリで句を削除します。Aggregate 関数がないと有効ではありませんが、MySQL ではエラーをスローせず、「ランダムな」行を返します。ORDER BY答えを並べ替えるために使用します。

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 users u    ON us.user_id = u.id

WHERE us.session_id IS NULL

ORDER BY us.id
于 2012-07-13T21:57:39.453 に答える
1

この解決策を試すことができます。うまくいく場合は、投稿を編集して説明を追加します。

SELECT
    a.id AS userSessionId,
    b.id AS scanId,
    a.session_id AS sessionId,
    a.user_id,
    c.name
FROM
(
    SELECT a.*
    FROM usersessions a
    LEFT JOIN scans b ON a.user_id = b.user_id AND a.session_id = b.session_id
    WHERE b.id IS NULL
) a
INNER JOIN
(
    SELECT id, session_id
    FROM scans
    GROUP BY id, session_id
) b ON a.session_id = b.session_id
INNER JOIN
    users c ON a.user_id = c.id

あなたのデータは次のようになっていると思います:

usersessions:
id  |  uid  |  session_id
-------------------------
45  |   39  |   39
46  |   40  |   39
47  |   41  |   39
48  |   42  |   39


scans:
id  |  uid  |  session_id
-------------------------
45  |  39   |  39
45  |  40   |  39
45  |  41   |  39

その場合、次のようになります。

userSessionId  |  scanId  |  sessionId  |  user_id  |  name
-----------------------------------------------------------
48             |  45      |  39         |  42       |  Mark

あなたのスキャンテーブルが次のように見えることが許されているかどうか教えてください:

scans:
id  |  uid  |  session_id
-------------------------
45  |  39   |  39
45  |  40   |  39
45  |  41   |  39
46  |  39   |  39
46  |  40   |  39
46  |  41   |  39
46  |  42   |  39

^ その場合、クエリは機能せず、書き直す必要があります (方法はわかっています)。

于 2012-07-13T22:30:29.710 に答える