0

以下で苦労しました。

3 つのテーブルがあります: プレーヤー、players_clothes、teams_clothes です。

players:

id ユーザー team_id
1タム4
2 ロボ 5
3 ボブ 4

つまり、トムとボブは同じチームに所属しています

players_clothes:

id clothes_id p_id
1 13 1
2 35 3
3 45 3

ボブには衣料品 35 と 45 があり、ロボには何もありません。

teams_clothes:

id clothes_id team_id
1 35 4
2 45 4
3 55 4
4 65 5

これは、どのチームがどの衣料品の権利を持っているかを示しています。問題: トムは自分のチームのものではない衣服を着ています...これは違法であると仮定しましょう。

特定のチームのために違法な服装をしているすべての人を捕まえる方法を理解するのに苦労しています.

SELECT pc.clothes_id FROM players AS p
JOIN players_clothes AS pc
ON p.id = pc.p_id
AND p.team_id = 4 GROUP BY pc.clothes_id

(信じられないかもしれませんが、2 人のプレイヤーに同じ服を割り当てることができるので、players_clothes.clothes_id でグループ化します)

これにより、次のセット(13、35、45)が得られると思います

チーム4が実際に持っている衣装と照らし合わせてみたいと思います。

SELECT clothes_id FROM teams_clothes WHERE team_id = 4 and this return (35, 45, 55)

(13) を返すようにクエリを作成するにはどうすればよいですか? NOT EXISTS IN などを試してみましたが、 GROUP BYplayers_clothes.clothes_id 部分が邪魔になると思います

4

3 に答える 3

1

これが遅すぎるかどうかはわかりませんが、そもそもデータベースモデル自体を変更して、この状況を不可能にします。

ここに画像の説明を入力

(PLAYER_ID などの代理キーを含め、簡潔にするために「重要でない」フィールドは省略されています。)

TEAM_ID が識別関係を介して TEAM から PLAYER に移行し、次に PLAYER_ARTICLE に移行し、そこでTEAM_ARTICLE を介して移行された同じフィールドとマージされることに注意してください。PLAYER_ARTICLE テーブルには物理的な TEAM_ID フィールドが 1 つしかないため、異なるチームを参照する行を挿入することはできません。

より抽象的な言葉で言えば、これはひし形の依存関係であり、TEAM が一番上にあり、PLAYER_ARTICLE がひし形の一番下にあります。下部での結合 (識別関係の使用によって有効化) により、両側が常に同じ上部を指さなければならないことが保証されます。


サンプルデータは次のように表されます...

プレーヤー:

TEAM_ID PLAYER_NO
4       1         -- Tom
5       1         -- Robo
4       2         -- Bob

TEAM_ATRICLE:

TEAM_ID ARTICLE_ID
4       35
4       45
4       55
5       65

PLAYER_ARTICLE:

TEAM_ID PLAYER_NO ATRICLE_ID
4       1         13         -- Tom: this is impossible (FK violation).
4       2         35         -- Bob
4       2         45         -- Bob
于 2013-06-05T23:17:46.403 に答える