0

So, lets say i have a user table. Each user has the ability to be in a team with upto 3 other users. So for now i have a column for each spot in the team(4 columns total, so your own id fills in a spot so you know where you fit in the team). And i put the ids to the other members of the team in each of the other columns. In the end, everyone on one team would have the same values in those 4 columns.

How would i query sql to look at those ids and pull the info for all the other users on there team (so by looking at one user, i can pull all 4 team members rows)? Is this the most efficient way of storing that data?

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 | TEAM_NAME | USER_ID | 用户名 |
|---------|-----------|---------|-----------|
| 2 | 团队2 | 2 | 用户2 |
| 2 | 团队2 | 4 | 用户4 |
| 2 | 团队2 | 5 | 用户5 |

这是SQLFiddle演示

于 2013-09-14T23:30:14.090 回答
0

我认为首先你不应该关心这是存储此类数据的最有效方式,而是最合乎逻辑的方式。MySQL 作为关系型数据库通常非常出色,因此以下内容应该表现得非常好:

做两张桌子。一个用于用户(带有 ID),一个用于团队。

在团队表中,您放置了用户的 4 个 ID。您可以输入团队 ID 和名称或任何您喜欢的内容,但不是必须的。

然后你会找到这样的团队条目:

SELECT * FROM team WHERE u1 == ? OR u2 == ? OR u3 == ? or u4 == ?;

然后您分别查询用户。

为了提高性能,您可以考虑表连接,将用户数据连接到团队条目:

SELECT * from team 
    LEFT JOIN user user1 ON u1 == user1.id
    LEFT JOIN user user2 ON u2 == user2.id
    LEFT JOIN user user3 ON u3 == user3.id
    LEFT JOIN user user4 ON u4 == user4.id;

这将为每个团队获取一行,其中包含所有用户详细信息。

更好:多对多

多对多关系有两个表(用户和团队)和一个关系表(team_users),其中包含成对的 ID 和潜在的其他值(例如团队中的位置)。

然后,您可以将用户映射到他的团队,并从中获取所有用户(和附加值),所有这些都仅使用关系表。使用连接,您可以再次获取您的信息以及映射,从而减少查询数量。MySQL 真的很擅长这个!

于 2013-09-14T23:17:27.680 回答