Php 联接SQL表

Php 联接SQL表,php,sql,join,Php,Sql,Join,假设在表“ab”中,我有从“a”班和“b”班相处的学生的名字,同样地,我有表“ac”和“bc”。我应该使用什么样的SQL查询来获得可以组成小组的学生的所有可能组合(即“相处融洽”)?如何将其扩展到n个类? 例如:a班的约翰与b班的珍和c班的斯特夫相处融洽,而珍和斯特夫相处融洽。因此,John、Jen和Steff可以组成一个组。此查询应返回所有可以与John在一个组中的学生 附言:写得很快,没有任何语法检查,希望你能把它带到工作中:)这个查询应该返回所有可以和John在一个组中的学生 注:写得很快

假设在表“ab”中,我有从“a”班和“b”班相处的学生的名字,同样地,我有表“ac”和“bc”。我应该使用什么样的SQL查询来获得可以组成小组的学生的所有可能组合(即“相处融洽”)?如何将其扩展到n个类?
例如:a班的约翰与b班的珍和c班的斯特夫相处融洽,而珍和斯特夫相处融洽。因此,John、Jen和Steff可以组成一个组。

此查询应返回所有可以与John在一个组中的学生


附言:写得很快,没有任何语法检查,希望你能把它带到工作中:)

这个查询应该返回所有可以和John在一个组中的学生


注:写得很快,不需要任何语法检查,希望您能够实现:)

为此,我将创建两个表,一个学生表(id、name、class)和一个关系表(student1、student2)。您可能还想为类的时间、位置等添加一个类表

友谊有两种关系(2,3)和(3,2),可以用两种方式来描述。一种可能是另一个学生的追随者或粉丝。 这将扩展到3个以上的类

然后,您可以使用多个连接来获取任意深度的朋友的朋友等等

下面是一个查询,用于获取好友的好友(fof):

还有一些数据库引擎专门为这样的图形建模而设计


为此,我将创建两个表,一个学生表(id、name、class)和一个关系表(student1、student2)。您可能还想为类的时间、位置等添加一个类表

友谊有两种关系(2,3)和(3,2),可以用两种方式来描述。一种可能是另一个学生的追随者或粉丝。 这将扩展到3个以上的类

然后,您可以使用多个连接来获取任意深度的朋友的朋友等等

下面是一个查询,用于获取好友的好友(fof):

还有一些数据库引擎专门为这样的图形建模而设计


代码可以满足初始查询

select ab.a, ab.b, ac.c
from
ab inner join
bc on ab.b = bc.b inner join
ac on ac.a = ab.a and bc.c = ac.c
升级到n个类将变得越来越复杂,因为n=4将是具有额外三个连接的同一个查询

inner join ad on ab.a = ad.a 
inner join bd on bd.b = ab.b and ad.d = bd.d
inner join cd on cd.c = ac.c and ad.d = cd.d 
2个类需要1个表,不需要联接,
3个类需要3个表和2个联接,
4个类需要6个表和5个联接


因此,我们可以看到,随着我们的继续,它会变得越来越复杂。

代码可以满足初始查询

select ab.a, ab.b, ac.c
from
ab inner join
bc on ab.b = bc.b inner join
ac on ac.a = ab.a and bc.c = ac.c
升级到n个类将变得越来越复杂,因为n=4将是具有额外三个连接的同一个查询

inner join ad on ab.a = ad.a 
inner join bd on bd.b = ab.b and ad.d = bd.d
inner join cd on cd.c = ac.c and ad.d = cd.d 
2个类需要1个表,不需要联接,
3个类需要3个表和2个联接,
4个类需要6个表和5个联接


因此,我们可以看到,随着我们的继续,它会变得越来越复杂。

首先,您不希望每个类都有一个表。您正在多个表中捕获相同类型的信息,这通常被认为是一种不好的做法。您希望“规范化”数据,以便相同的数据存在于一个位置

其次,适当地命名表,以便了解实际要构建的内容。也许您在问题中使用“ab”来概括实际实现的意图,但如果您在实际代码中这样做,从长远来看会对您造成伤害

似乎您需要一个包含姓名的人员表和一个用于跟踪谁是谁的朋友的朋友表:

create table people ( id int, name char(128) );
create table friends ( id int, person_id int, friend_id int );
然后,您只需查询即可获得组:

SELECT person.* FROM friends
INNER JOIN friends grp
        ON friends.friend_id = grp.person_id
INNER JOIN people person
        ON person.id = grp.friend_id
WHERE friends.person_id = 42;

首先,您不希望每个类都有一个表。您正在多个表中捕获相同类型的信息,这通常被认为是一种不好的做法。您希望“规范化”数据,以便相同的数据存在于一个位置

其次,适当地命名表,以便了解实际要构建的内容。也许您在问题中使用“ab”来概括实际实现的意图,但如果您在实际代码中这样做,从长远来看会对您造成伤害

似乎您需要一个包含姓名的人员表和一个用于跟踪谁是谁的朋友的朋友表:

create table people ( id int, name char(128) );
create table friends ( id int, person_id int, friend_id int );
然后,您只需查询即可获得组:

SELECT person.* FROM friends
INNER JOIN friends grp
        ON friends.friend_id = grp.person_id
INNER JOIN people person
        ON person.id = grp.friend_id
WHERE friends.person_id = 42;

这看起来像是一个糟糕的模式设计。