这种情况很难解释,但我会尽我所能。
对于学校,我们必须创建一个Web应用程序(用PHP编写),允许教师管理学生的项目并允许他们进行同行评估。由于学生人数众多,因此每个项目都有多个项目组(当然,您只应对自己的小组成员进行同行评估)。
我的数据库结构目前看起来像这样:
表用户:包含所有用户信息(user_id为主要用户)
表:项目:包含project_id,名称,描述和开始日期。
到目前为止,这很容易。但现在变得更加困难。
表组:包含group_id,组名和组特定于项目,它还包含project_id。 表组成员:组包含多个用户,但用户可以位于多个组中(因为它们可以在多个项目中处于活动状态)。所以这个表包含一个user_id和一个group_id来链接这些。
最后,管理员可以决定用户何时需要进行同行评估以及他们有多少时间进行评估。因此,最后一个表评估包含了evaluation_id,一个开始和结束日期以及一个project_id(实际评估存储在第六个表中,现在与此无关)。
我认为这是一个很好的设计,但实际上我必须使用这些数据时会变得更难。我想展示一份您仍需要填写的评估列表。您唯一知道的是您的user_id,因为它存储在会话中。
所以必须这样做:
1)对groupmembers运行查询以查看用户在哪些组中
2)使用此结果,对组运行查询以查看这些组相关的项目
3)现在我们知道用户在哪些项目中,应该查询评估表以查看是否正在对该项目进行评估。
4)我们现在知道哪些评估可用,但现在我们还需要检查第六个表以查看用户是否已完成此评估。
所有这些步骤都取决于彼此的结果,因此它们都应包含自己的错误处理。一旦用户选择了他们希望填写的评估(评估ID将通过GET发送),就必须运行许多新的查询来检查该成员在他的组中的哪些用户并且必须进行评估并进行另一次检查查看已评估的其他组成员。)
如你所见,这非常复杂。包含所有错误处理,我的脚本将是一个真正的混乱。有人告诉我,“观点”可能会对这种情况有所帮助,但我真的不明白为什么这会对我有所帮助。
有没有好办法呢?
非常感谢!
答案 0 :(得分:1)
你在想程序性的。
所有条件都应该很容易地输入到sql语句的一个where子句中。
您最终会得到一个要评估的项目列表。只有一个列表,只有一组错误处理。
答案 1 :(得分: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,但这是另一个主题。