2012-02-10 6 views
0

私がしようとしているのは、行が追加されたときに生年月日から自動集計されるフィールドです。 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_を保存することはお勧めできません。それは冗長であるように試験が、それはあなたが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 

これは以前Mostyで述べたようにtest_periodが最新であることを前提としています。私はこれを試していませんが、今はサーバーにアクセスできないので、ちょっと微調整する必要があります。

UPDATE:あなたはあなたの統計のための出発点として、以下のことを試みることができる -

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 - stats selectステートメントの 'field list'の '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

関連する問題