Php 使用类型列定义用户关系时的高效使用

Php 使用类型列定义用户关系时的高效使用,php,mysql,database,codeigniter,Php,Mysql,Database,Codeigniter,这是我的第一次!快速概述: 场景 我正在创建一个应用程序,你可以在其中挑战其他用户做一些事情(例如,本周跑4英里,蹲下3个盘子,等等)。我更多的是一个前端的家伙,所以我有一些问题与一些数据库trolling什么的 对于用户之间的友谊关系,我使用两行来表示回报。我请求您作为朋友,我的uid和您的uid将被放入关系表中。一旦你接受了它,就会添加相反的内容 但是,当涉及到挑战时,我真的宁愿每个挑战只使用一行,然后随着事情的进展更新类型。类型0=发出质询,1=接受质询,2=质询完成 我有另一个表,其中包

这是我的第一次!快速概述:

场景 我正在创建一个应用程序,你可以在其中挑战其他用户做一些事情(例如,本周跑4英里,蹲下3个盘子,等等)。我更多的是一个前端的家伙,所以我有一些问题与一些数据库trolling什么的

对于用户之间的友谊关系,我使用两行来表示回报。我请求您作为朋友,我的uid和您的uid将被放入关系表中。一旦你接受了它,就会添加相反的内容

但是,当涉及到挑战时,我真的宁愿每个挑战只使用一行,然后随着事情的进展更新类型。类型0=发出质询,1=接受质询,2=质询完成

我有另一个表,其中包含每个挑战的信息(条款、开始日期、结束日期、奖励等),因此每个挑战都将与挑战信息表中的一行相关联。这是我希望/需要在挑战表中每个挑战只包含一行的另一个原因

问题 现在我遇到的问题是试图获取用户最新挑战的反馈。所以,你进入Tom的个人资料页面,你会看到他最近的活动列表:“Tom挑战Amy并赢了!Tom输给了John。等等。”

我可以加入挑战表上的用户表,并获得特定用户的挑战,只有某些类型的挑战,以及诸如此类的事情,但我找不到一种有效的方法来获取挑战此用户或被此用户挑战的人的用户名

表格

__USER__

ID  UNAME  
1   Tom  
2   John  
3   Timmy  


__CHALLENGES__  
CID    Challenger_ID    Challenged_ID      Type  
1        1                2                 0  
2        1                3                 1  
3        2                1                 2  
悬崖 定义这类关系的最有效方法是什么?我如何加入这些表,以便找到Tom参与的所有挑战,同时获取他与之互动的人的姓名和关系(挑战者或被挑战者?


谢谢你的时间和考虑

只要Challenger_ID被编入索引,您就可以使用2个左连接(我假设USER.ID被编入PK的索引中):

或者只使用内部联接:

select U1.uname, U2.uname from USER U1, USER U2, CHALLENGES C
where C.Challenger_ID = U1.ID AND C.Challenged_ID = U2.ID

执行计划将根据您的索引而有所不同,但您知道了。

只要Challenger_ID被索引,您就可以使用2个左连接(我假设USER.ID被索引为PK):

或者只使用内部联接:

select U1.uname, U2.uname from USER U1, USER U2, CHALLENGES C
where C.Challenger_ID = U1.ID AND C.Challenged_ID = U2.ID

执行计划将根据您的索引而有所不同,但您会明白这一点。

非常有用,谢谢!我必须跑步,所以我现在必须简短,但我使用了第一个选项,两个左连接,效果非常好。下面是我最后使用的:
从用户U1中选择U1.uname,U2.uname在C.Challenger上选择U1左加入挑战C\u uid=U1.uid在C.Challenger上选择U2左加入用户U2\u uid=U2.uid,其中(U1.uid='6'或U2.uid='6')和C.type='1'
效果非常好!!我将在当天晚些时候检查内部连接,然后返回给您。现在我明白了,这很有道理,非常感谢!好的,我回来了。如果你有时间和耐心,你介意用这样的方式来解释你的思维过程吗?我现在看到,我想要两次返回'uname',显然需要在查询中使用用户表(包含'uname')两次。但总的来说,我很想看看你如何得出结论的基本原则,虽然可能没什么特别的,只是我是一个完整的n00b:)非常有帮助,谢谢!我必须跑步,所以我现在必须简短,但我使用了第一个选项,两个左连接,效果非常好。下面是我最后使用的:
从用户U1中选择U1.uname,U2.uname在C.Challenger上选择U1左加入挑战C\u uid=U1.uid在C.Challenger上选择U2左加入用户U2\u uid=U2.uid,其中(U1.uid='6'或U2.uid='6')和C.type='1'
效果非常好!!我将在当天晚些时候检查内部连接,然后返回给您。现在我明白了,这很有道理,非常感谢!好的,我回来了。如果你有时间和耐心,你介意用这样的方式来解释你的思维过程吗?我现在看到,我想要两次返回'uname',显然需要在查询中使用用户表(包含'uname')两次。但总的来说,我希望看到你如何得出结论的基本原则,尽管可能没什么特别的,只是我是一个完整的n00b:)