mySQL使用另一个表中的计算值填充DB列

时间:2012-02-10 07:34:29

标签: mysql sql triggers

我要做的是有一个名为“年龄”的字段。在添加一行时,从出生日期开始自动填充 - 诀窍是出生日期位于另一个领域。

我的两张表是:

学生

  

student_id(PK),first_name,last_name,date_of_birth

fitness_report

  

report_id(PK),test_date,test_period,age_tested,student_id(FK)

理想情况下,age_tested将从test_period进行计算,但是很高兴使用(),因为它将在合理的范围内。

显然我需要做的是创建一个触发器 - 但不确定SELECT语句是否可以填充年龄。非常感谢帮助。

2 个答案:

答案 0 :(得分:0)

这是如何获得当前年龄:

select s.name, s.date_of_birth,
  date_format(now(), '%Y') - date_format(date_of_birth, '%Y') - 
  (date_format(now(), '00-%m-%d') < date_format(date_of_birth, '00-%m-%d'))
as age
from s

Example

这是如何让年龄达到test_period(不应该是test_date?):

select s.name, s.date_of_birth, r.test_period,
  date_format(test_period, '%Y') - date_format(date_of_birth, '%Y') - 
  (date_format(test_period, '00-%m-%d') < date_format(date_of_birth, '00-%m-%d'))
as age
from r
join s on s.id_student = r.student_id

Example

答案 1 :(得分:0)

正如rwilliams所说,不建议存储age_tested,因为它是多余的,但如果你想做什么,你可以在Mosty的解决方案中包含一个简单的触发器 -

CREATE TRIGGER fitness_report_insert BEFORE INSERT ON `fitness_report`
FOR EACH ROW
BEGIN

    SET NEW.age_tested = (SELECT DATE_FORMAT(NEW.test_period, '%Y') - DATE_FORMAT(student.date_of_birth, '%Y') - (DATE_FORMAT(NEW.test_period, '00-%m-%d') < DATE_FORMAT(student.date_of_birth, '00-%m-%d')) FROM student WHERE student.student_id = NEW.student_id);

END

这假设test_period是Mosty之前提到的日期。我没有尝试过这个,因为我现在无法访问服务器,所以可能需要稍微调整一下。

更新:你可以尝试以下作为统计数据的起点 -

SELECT
    DATE_FORMAT(test_period, '%Y') - DATE_FORMAT(date_of_birth, '%Y') - (DATE_FORMAT(test_period, '00-%m-%d') < DATE_FORMAT(date_of_birth, '00-%m-%d')) AS age,
    s.gender,
    AVG(r.score) AS score
FROM student s
INNER JOIN fitness_report r 
    ON s.student_id = r.student_id
GROUP BY age, s.gender