-1

在此处输入图像描述 请查看随附的屏幕截图。红线上方的图像显示了用户注册的培训课程的摘要。

对该图像特别感兴趣的是名为 的列标题Available

每当用户注册培训时,该数字都会减少 1。

例如,根据图像,当前可用座位是 29。如果用户注册该课程,则人数会减少 1 到 28。

到目前为止,这运作良好。

如果用户决定,无论出于何种原因,她/他不能参加他/他注册的课程,用户将需要单击Cancel Training按钮从他/她的列表中删除该课程,如下图所示读线。

发生这种情况时,它会腾出一个座位。

这也很好。

我们想要做的是将该座位添加回红线上方的图像列表中。

所以,假设Available座位是 28 并且用户取消了他/她的座位,我们想把那个座位放回去,所以现在它增加了 1 到 29。

我不确定我做错了什么,但下面的代码显示了所有座位,而不是显示 28 个座位的记录。

Insert into tblTrainings (availableSeats)
select (t.availableseats+1)availableseats
from   tblTrainings t Inner Join tblCourses c on t.courseId = c.courseId  
       Inner Join tblLocations l on t.locationId = l.LocationId  
       Inner Join tblTrainingDates d on c.dateid=d.dateid  
       Inner Join tblCourseInstructor ic on c.courseId = ic.CourseId  
       Inner Join tblInstructors i on ic.instructorId = i.instructorId
where t.locationid=2;
DELETE FROM tblTrainings WHERE trainingId = @trainingid and username = @uchide" 

只是关于设计的一点信息。

我们有以下查找表:

tblLocations, tblCourses, tblInstructors, tblCourseInstructor, tblTrainingDates

4

1 回答 1

0

从您提到的聊天中,您想要一个不需要将 AvailableSeats 存储在数据库中的解决方案。

这个问题有两种通用的解决方案。一种非常容易编码,但存在一些可扩展性问题;另一个稍微复杂一些,但可以很好地适应您的网站。

第一种解决方案的步骤:

  • 向您的用户表添加一个变量列,该列存储每个用户的课程 ID
  • 创建简单的 UPDATE 查询,在每个用户注册/删除课程时为他们添加/删除课程 ID
  • 要自动跟踪可用座位有两个查询
    • 从课程表中收集 MaxSeats 的一种
    • 另一个查询用户表中的所有用户并计算在其课程 ID 字段中具有所选课程 ID 的所有用户。

只要对 UPDATE 有基本的了解,并且在给定正确的 DB 结构时,实现这一点的 SELECT 查询应该非常简单。

注意:这有一些可扩展性问题,因为当您获得大量用户时,您需要在每个用户中搜索他们的课程 ID;并且加载时间随着用户数量的增加而增加。

第二种解决方案的步骤:

  • 向您的课程表添加一个变量列,该列将包含一个表示用户 ID 数组的字符串
  • 实现可以分解、处理、编辑和重构数组字符串的代码
  • 实现从 maxSeats 值中减去该数组中的用户数量的代码。

注意:尽管此解决方案仍然在后端使用简单的 UPDATE 查询,但创建跟踪系统以管理数组结构的过程可能非常繁琐。

许多用户会认为第三种解决方案与第一种解决方案类似,但在用户注册/放弃课程时,还会在课程表中添加一列,其中包含可用席位和加分/减分 1。

这在技术上可能有效;但它效率低下,因为您在数据库后端不必要地使用了额外的空间。这是不必要的,因为您需要附加到每个用户的课程 ID 才能知道谁在课程中;仅凭这一点,您就可以计算出还剩下多少个座位(AvailableSeats = MaxSeats - NumPeopleEnrolled)

于 2013-06-10T17:09:07.713 回答