【问题标题】:How do I use one row to pull multiple other rows from the same mySQL table如何使用一行从同一个 mySQL 表中提取多个其他行
【发布时间】:2013-09-14 23:11:18
【问题描述】:

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

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

【问题讨论】:

  • 规范化您的数据并拥有一个 team_members 表,而不是针对每个用户复制团队详细信息

标签: php mysql pdo


【解决方案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演示

【讨论】:

  • 谢谢,我对 SQL 和数据库还很陌生,所以这需要我一些时间来弄清楚如何使用它,但是你给了我我需要的东西!
  • 当我研究这个时,我被挂了:这个查询只有在我了解团队的情况下才有效。但我首先了解的是用户,而不是团队。那么,首先有一个用户 ID,我如何为他的所有其他队友提取行?
  • @DauntlessRob 不客气 :) 这就是 JOINs 的用途。请参阅更新的答案和 sqlfiddle 示例。
  • 哇!谢谢!这正是我所需要的!
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-18
    • 2018-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-15
    • 2013-11-12
    相关资源
    最近更新 更多