2012-02-10 4 views
0

행을 추가 할 때 생년월일에서 autopopulate라는 필드가 있어야합니다. - 트릭은 생년월일입니다. anouther 분야.mySQL 테이블 열에서 계산 된 값을 사용하여 DB 열 채우기

내 두 개의 테이블은 다음과 같습니다

학생

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 문에 나이가 채워지는 것은 확실하지 않습니다. 도움을 많이 주시면 감사하겠습니다.

+0

나는 fitness_report에서 나이를 저장하지 않을 것입니다. 테스트 한 날짜와 학생 dob가 있으므로 필요할 때마다 age_tested를 계산할 수 있습니다. – rwilliams

+0

SELECT를 요청하는 경우 주어진 날짜를 기준으로 연령을 계산하는 방법을 묻는 것입니까? –

답변

0

rwilliams가 말했듯이 age_를 저장하는 것은 좋지 않습니다.

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에서 언급 한 바와 같이 날짜가 있다고 가정합니다 - 그것은 중복하지만 당신이 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 
+0

흠 나는 나이를 저장하지 않는 것에 대한 요점을 본다. – user1201502

+0

흠 나는 나이를 저장하지 않는 것에 대한 요점을 본다. 어쩌면 큰 그림을 얻기 위해 노력하고있는 것을 도울 수 있습니다. 내 예상 논리 디자인은 다음과 같습니다. http://webjunction.com.au/Logical.pdf 이제 통계 테이블을 제거하고 일련의 SELECT 문을 작성하려고합니다. 나이와 성별에 따라 각 테스트의 평균 통계를 가져오고 싶습니다. 12 세 남성의 평균 점수를 얻기 위해 select 문을 제안 해 주시겠습니까?(거기에서 나는 나머지를 계산할 수있을 것이다) 도움을 많이 받으실 수 있습니다! – user1201502

+0

# 1054 - 통계 선택 명령문의 '필드 목록'에 알 수없는 열 'r.score'가 있습니다. – user1201502

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_date 안)에 test_period에 나이를 받으시는 방법 :

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

관련 문제