如何使用一行从同一个mySQL表中提取多个其他行

时间:2013-09-14 23:11:19

标签: php mysql pdo

所以,假设我有一个用户表。每个用户都可以与最多3个其他用户组成团队。所以现在我的团队中每个点都有一个列(总共4列,所以你自己的id填充了一个位置,所以你知道你在团队中的位置)。我把ID放在团队中其他成员的每个其他列中。最后,一个团队中的每个人在这4列中都具有相同的值。

我如何查询sql以查看这些ID并为该团队中的所有其他用户提取信息(因此,通过查看一个用户,我可以拉出所有4个团队成员行)?这是存储数据的最有效方式吗?

2 个答案:

答案 0 :(得分: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

示例输出:

| TEAM_ID | TEAM_NAME | USER_ID | USER_NAME |
|---------|-----------|---------|-----------|
|       2 |     team2 |       2 |     user2 |
|       2 |     team2 |       4 |     user4 |
|       2 |     team2 |       5 |     user5 |

这是 SQLFiddle 演示

答案 1 :(得分:0)

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

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

在团队表中,您输入了4个用户ID。如果你愿意,你可以输入一个团队ID和名字或其他任何东西,但不必。“/ p>

然后你会发现这样的团队条目:

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真的很擅长这个!