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

Php 如何使用一行从同一个mySQL表中提取多个其他行,php,mysql,pdo,Php,Mysql,Pdo,假设我有一个用户表。每个用户都可以与最多3个其他用户组成一个团队。所以现在我为团队中的每个位置都设置了一列(总共4列,所以您自己的id会填充一个位置,这样您就知道自己适合团队的位置)。我将ID放在其他列中的其他团队成员。最后,一个团队中的每个人在这4列中的值都是相同的 我如何查询sql以查看这些ID并提取团队中所有其他用户的信息(因此通过查看一个用户,我可以提取所有4个团队成员行)?这是存储数据的最有效方式吗?我认为首先,您不应该关心这是存储此类数据的最有效方式,而是最符合逻辑的方式。MySQL

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


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

我认为首先,您不应该关心这是存储此类数据的最有效方式,而是最符合逻辑的方式。MySQL通常非常擅长作为关系数据库,因此以下性能应该非常好:

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

在team表中,您放置了用户的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;
这将为每个团队获取一行,其中包含所有用户详细信息

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


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

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

以简化形式提出的模式可能如下所示

创建表用户
(
`用户id`int非空自动增量主键,
`用户名'varchar(5)
);  
创建表格团队
(
`团队id`int非空自动增量主键,
`队名`瓦查尔(5)
);
创建表team\u用户
(
`团队id`int,
`用户id`int,
主键(团队id、用户id),
外键(团队id)引用团队(团队id),
外键(用户id)引用用户(用户id)
);
如果您需要为名为“team2”的团队提取所有成员

选择t.team\u id、t.team\u name、u.user\u id、u.user\u name
从team_用户加入team t
在tu.team_id=t.team_id加入用户u
ON tu.user\u id=u.user\u id
其中t.team_name='team2'
如果您需要获得一个团队的所有成员,其中
user\u id=2的用户是该团队的成员

选择t.team\u id、t.team\u name、u.user\u id、u.user\u name
从团队用户tu加入团队用户tu2
ON tu.team_id=tu2.team_id加入团队t
在tu.team_id=t.team_id加入用户u
ON tu.user\u id=u.user\u id
其中tu2.user_id=2
样本输出:

| TEAM_ID | TEAM_NAME | USER_ID | USER_NAME | |---------|-----------|---------|-----------| | 2 | team2 | 2 | user2 | | 2 | team2 | 4 | user4 | | 2 | team2 | 5 | user5 | |团队ID |团队名称|用户ID |用户名称| |---------|-----------|---------|-----------| |2 |团队2 | 2 |用户2| |2 |团队2 | 4 |用户4| |2 |团队2 | 5 |用户5|
这里是演示

规范化您的数据并创建一个团队成员表,而不是针对每个用户复制团队详细信息谢谢,我对SQL和数据库相当陌生,因此这将花费我一些时间来思考如何使用它,但您已经给了我我所需要的!当我研究这个问题时,我被挂在这里:这个查询只有在我了解团队的情况下才有效。但我首先了解用户,而不是团队。那么,首先要有一个用户id,我如何为他的所有其他队友划行呢?@DauntlessRob你很受欢迎:)这就是
JOIN
s的作用。请参阅更新的答案和sqlfiddle示例。哇!谢谢这正是我需要的!