0

だから、私はユーザーテーブルを持っているとしましょう。各ユーザーは、最大 3 人の他のユーザーとチームを組むことができます。したがって、今のところ、チームの各スポットの列があります (合計 4 列なので、自分の ID がスポットを埋めるので、チームのどこに収まるかがわかります)。そして、チームの他のメンバーの ID を他の各列に入力しました。最終的に、1 つのチームの全員が、これら 4 つの列で同じ値を持つことになります。

これらの ID を確認し、チームの他のすべてのユーザーの情報を取得するために SQL をクエリするにはどうすればよいでしょうか (1 人のユーザーを確認することで、4 つのチーム メンバーの行すべてを取得できます)。これはそのデータを保存する最も効率的な方法ですか?

4

2 に答える 2

1

最初からデータを正規化します。長期的には大きな利益をもたらします。このようにして、通常どおりデータを維持およびクエリできます。

簡略化された形式で提案されたスキーマは、次のようになります

CREATE TABLE users
(
  `user_id` int not null auto_increment primary key, 
  `user_name` varchar(5)
);  
CREATE TABLE teams
(
  `team_id` int not null auto_increment primary key, 
  `team_name` varchar(5)
);
CREATE TABLE team_users
(
  `team_id` int, 
  `user_id` int,
  primary key (team_id, user_id),
  foreign key (team_id) references teams (team_id),
  foreign key (user_id) references users (user_id)
);

「team2」という名前のチームのすべてのメンバーをプルする必要がある場合

SELECT t.team_id, t.team_name, u.user_id, u.user_name
  FROM team_users tu JOIN teams t
    ON tu.team_id = t.team_id JOIN users u
    ON tu.user_id = u.user_id
 WHERE t.team_name = 'team2'

user_id = 2ユーザーがメンバーであるチームのすべてのメンバーを取得する必要がある場合

SELECT t.team_id, t.team_name, u.user_id, u.user_name
  FROM team_users tu JOIN team_users tu2
    ON tu.team_id = tu2.team_id JOIN teams t
    ON tu.team_id = t.team_id JOIN users u
    ON tu.user_id = u.user_id 
 WHERE tu2.user_id = 2

出力例:

| | チーム ID | チーム名 | ユーザー ID | ユーザー名 |
|---------|-----------|---------|-----------|
| | 2 | チーム2 | 2 | ユーザー2 |
| | 2 | チーム2 | 4 | ユーザー4 |
| | 2 | チーム2 | 5 | ユーザー5 |

これがSQLFiddleのデモです

于 2013-09-14T23:30:14.090 に答える