mySQL заполнить столбец БД, используя вычисленное значение из другой таблицы - PullRequest
0 голосов
/ 10 февраля 2012

То, что я пытаюсь сделать, - это заполнить поле, называемое «возраст», автопопуляцией, начиная с даты рождения людей, когда добавляется строка - хитрость заключается в том, что дата рождения людей находится в другом поле.

Мои две таблицы:

студент

student_id (PK), имя, фамилия, имя, дата рождения

fitness_report

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

в идеале age_tested будет рассчитываться из test_period, однако с удовольствием используйте () СЕЙЧАС, так как это будет в разумных пределах.

Очевидно, что мне нужно здесь создать триггер - но не уверен в операторе SELECT, чтобы получить возраст для заполнения. Помощь очень ценится.

Ответы [ 2 ]

0 голосов
/ 10 февраля 2012

Как сказал rwilliams, не рекомендуется хранить age_tested, поскольку он избыточен, но если это то, что вы хотите сделать, вы можете обернуть простой триггер вокруг решения Мости -

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 - это дата, упомянутая ранее Мости. Я не пробовал этого, так как сейчас у меня нет доступа к серверу, поэтому может потребоваться небольшая настройка.

ОБНОВЛЕНИЕ: Вы можете попробовать следующее в качестве отправной точки для вашей статистики -

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 голосов
/ 10 февраля 2012

Вот как узнать текущий возраст:

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

Пример

Вот как получить возраст до 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

Пример

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...