繁体   English   中英

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

[英]How do I use one row to pull multiple other rows from the same mySQL table

因此,可以说我有一个用户表。 每个用户都可以与最多3个其他用户组成一个团队。 因此,现在我在团队中的每个位置都有一列(总共4列,因此您自己的ID会填充一个位置,以便您知道自己在团队中的位置)。 我将ID分配给其他各列中的团队其他成员。 最后,一个团队中的每个人在这4列中将具有相同的值。

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

从一开始就规范化您的数据。 从长远来看,这将带来丰厚的回报。 这样,您将能够正常维护和查询数据。

以简化形式提出的模式可能看起来像这样

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演示

我认为首先您不应该在意这是存储此类数据的最有效方法,而是最合乎逻辑的方法。 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真的很擅长此事!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM