关于Mysql更新!

时间:2011-07-30 07:36:45

标签: c# mysql

我正在winform,mysql,c#做大学项目。

为此我创建了具有此结构的mysql表,..

CREATE TABLE `attendance_monthly_rpt` (
  `id` int(15) NOT NULL AUTO_INCREMENT,
  `student_no` varchar(50) NOT NULL,
  `student_name` varchar(50) NOT NULL,
  `day1` varchar(15) NOT NULL,
  `day2` varchar(15) NOT NULL,
  `day3` varchar(15) NOT NULL,
  `day4` varchar(15) NOT NULL,
  `day5` varchar(15) NOT NULL,
  `day6` varchar(15) NOT NULL,
  `day7` varchar(15) NOT NULL,
  `day8` varchar(15) NOT NULL,
  `day9` varchar(15) NOT NULL,
  `day10` varchar(15) NOT NULL,
  `day11` varchar(15) NOT NULL,
  `day12` varchar(15) NOT NULL,
  `day13` varchar(15) NOT NULL,
  `day14` varchar(15) NOT NULL,
  `day15` varchar(15) NOT NULL,
  `day16` varchar(15) NOT NULL,
  `day17` varchar(15) NOT NULL,
  `day18` varchar(15) NOT NULL,
  `day19` varchar(15) NOT NULL,
  `day20` varchar(15) NOT NULL,
  `day21` varchar(15) NOT NULL,
  `day22` varchar(15) NOT NULL,
  `day23` varchar(15) NOT NULL,
  `day24` varchar(15) NOT NULL,
  `day25` varchar(15) NOT NULL,
  `day26` varchar(15) NOT NULL,
  `day27` varchar(15) NOT NULL,
  `day28` varchar(15) NOT NULL,
  `day29` varchar(15) NOT NULL,
  `day30` varchar(15) NOT NULL,
  `day31` varchar(15) NOT NULL,
  `tot_persent` int(15) NOT NULL,
  `tot_absent` int(15) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;

我用P,Ab,OD更新此表第day1到第31天的列。现在我想将tot_absent逻辑中的tot_persent更新为Ab与P和OD之和的总和。

例如......

IHM22557001,Jegadeeswaran,Ab,P,Ab,OD,0,0,OD,Ab,0,0,0,Ab

tot_persent是3 tot_absent是4 ..

提前感谢。

1 个答案:

答案 0 :(得分:4)

我要建议一个不同的架构;天为主。如果你有基于日期的,即

Id, StudentNumber, Date, Status

请注意,预先计算的表格中的更新tot_persent等 不存在 ,因为它们在数据中很容易获得。

然后可以通过漂亮的方式获得数据:

SELECT   Date, Status
FROM     StudentAttendance
WHERE    StudentNumber = @no
AND      Date >= @start AND Date <= @end
ORDER BY Date

和聚合

SELECT   Status, COUNT(1)
FROM     StudentAttendance
WHERE    StudentNumber = @no
AND      Date >= @start AND Date <= @end
GROUP BY Status

此外,使用基于日期的记录还可以轻松地在应用层中执行聚合,而不是尝试在数据库中执行所有操作 - 如果您拥有当天的数据,则不会< em>需要数据库来进行聚合(LINQ-to-Objects会很好,因为你提到了C#)。

我个人我会使用基于整数的Status,但这是主观的。但将其映射到C#枚举可以很好地工作,即

public enum AttendanceStatus : byte {
    Present= 1,
    Absent = 2,
    ...your other values etc...
}

可能是由tinyint或类似的DB。大多数ORM /微观ORM会自动为您映射,因此您不必在那里做任何聪明的事情。