2011-04-05 74 views
0

这种情况很难解释,但我会尽我所能。数据库中的多个连接

对于学校,我们必须创建一个Web应用程序(用PHP编写),它允许教师管理学生的项目,并允许他们进行同伴评估。由于学生人数众多,每个项目都有多个项目组(当然,你只应该评估你自己的小组成员)。

我databasestructure看起来像这样的时刻:

用户:包含所有用户的信息(user_id是主要的)
表:项目:包含PROJECT_ID,名称,描述和开始日期。

到目前为止,这很容易。但现在变得更加困难。

:包含group_id,groupname,作为一个组特定于项目,它也包含project_id。
groupmembers:一个组包含多个用户,但用户可以在多个组中(因为他们可以在多个项目中处于活动状态)。所以这个表格包含一个user_id和一个group_id来链接这些。

最后,管理员可以决定用户何时需要进行对等评估以及他们有多少时间进行评估。因此,最后一个表评估包含一个evaluation_id,一个开始日期和一个结束日期以及一个project_id(实际评估存储在第六个表中,这与现在不相关)。

我认为这是一个很好的设计,但是当我真的需要使用这些数据时会变得更加困难。我想显示一个评估列表,你仍然需要填写。你知道的唯一的事情就是你的user_id,因为它存储在会话中。

所以必须这样做:
1)在groupmembers上运行查询以查看用户在哪个组中。
2)使用此结果,对组运行查询以查看这些组与哪些项目相关。
3)现在我们知道用户所在的项目,应该查询评估表以查看是否有正在进行的项目评估。
4)现在我们知道哪些评估是可用的,但现在我们还需要检查第六个表,以查看用户是否已完成此评估。

所有这些步骤都依赖于对方的结果,所以它们应该都包含自己的错误处理。一旦用户选择了他们希望填写的评估(评估ID将通过GET发送),将需要运行许多新的查询以检查该成员在他的组中有哪些用户并且将必须评估并且另一个支票看看哪些其他小组成员已经被评估过)。

如您所见,这是相当复杂的。包括所有错误处理,我的脚本将是一个真正的混乱。有人告诉我一个“观点”可能有助于这种情况,但我不明白为什么这会帮助我。

有没有很好的方法来做到这一点?

非常感谢!

+0

看起来像你有依赖到另一个。 INNER JOIN不会解决问题,看看这篇文章 - > http://www.codeproject.com/KB/database/Visual_SQL_Joins.aspx – B4NZ41 2011-04-05 17:45:24

+2

你试过了什么? – Cfreak 2011-04-05 17:45:58

+0

谢谢你的链接,我会看看。我试图按照我提到的步骤,但它非常非常混乱,所以我创建了这个线程。 – Bv202 2011-04-05 17:47:35

回答

1

您在程序上也在考虑。

你所有的条件都应该很容易地被输入到sql语句的where语句中。

您将最终得到一个待评估项目的列表。只有一个列表,只有一组错误处理。

0

不确定这是否正确,但尝试这种基本方法。我没有针对实际的数据库运行此操作,因此可能需要调整语法。

select p.project_name 
from projects p inner join evaluations e on p.project_id = e.project_id 
where p.project_id in (
select project_id 
from projects p inner join groups g on p.project_id = g.project_id 
inner join groupmembers gm on gm.group_id = g.group_id 
where gm.user_id = $_SESSION['user_id']) 

此外,你需要确保使当查询的一部分,你正确地逃脱你的user_id,但是这是一个整体的其他话题。