В MySQL, как бы я сравнил сегодняшнюю дату с датой в моей таблице базы данных? - PullRequest
3 голосов
/ 27 апреля 2011

Я создаю веб-приложение для беременных (для моего курса веб-разработки в колледже)
и в моей базе данных хранится дата зачатия каждого пользователя.

В своем заявлении я беру дату зачатия, сравниваю ее с сегодняшним днем ​​и даю пользователю немного информации об этом моменте беременности.

В моей базе данных также есть таблица, в которой хранится запись для каждой "Стадии" беременности (т. Е. Стадия 1 = 1-2 месяца, Стадия 2 = 2-3 месяца и т. Д.)
Так как бы я структурировал мой запрос MySQL?Это то, с чем я пытался работать ...

SELECT s.id as stageid
  , p.id as patientid
  , s.name
  , s.nutritioninfo
  , s.commonsymptoms
  , p.conceptiondate 
FROM stage s, patient p 
WHERE p.id=? AND TO_DAYS(p.conceptiondate)=To_DAYS(NOW());,

Последняя строка (часть TO_Days()=TO_DAYS()) выше - это часть, где я борюсь.
Было бы целесообразно сохранитьстрока для начальной и конечной даты для каждого этапа в моей таблице «Этап»?
Но тогда как это будет работать, поскольку у всех моих пользователей будут разные даты зачатия?

Я буду использовать этот запросв PHP и затем с помощью этого запроса PHP внутри моего интерфейса, который построен в ExtJS.

Ответы [ 2 ]

3 голосов
/ 27 апреля 2011

Ваш запрос

SELECT s.id as stageid
  , p.id as patientid
  , s.name
  , s.nutritioninfo
  , s.commonsymptoms
  , p.conceptiondate 
FROM stage s, patient p 
WHERE p.id=? and TO_DAYS(p.conceptiondate)=To_DAYS(NOW());,

Имеет несколько проблем:

  1. Не используйте синтаксис неявного соединения (соединения с использованием где), это сбивает с толку и осуждается; всегда используйте явные объединения! см. Ниже.
  2. Нигде в вашем запросе нет критерия соединения, при котором поле из stage s соединяется с полем из patient p, например, (join on p.x = s.y)
  3. Я бы не рекомендовал использовать отдельные дни в вашей базе данных.Используйте диапазоны вместо замены поля stage.stageday на 2 поля stage.startday и stage.endday

Вот мое предложение:

SELECT s.id as stageid
 , p.id as patientid
 , s.name
 , s.nutritioninfo
 , s.commonsymptoms
 , p.conceptiondate 
FROM patient p
INNER JOIN stage s 
  ON (DATEDIFF(CURDATE(), p.conceptiondate) BETWEEN s.startday AND s.endday)
WHERE p.id=?

При этом используется явное объединение cf ANSIСинтаксис 92 , который четко показывает, как объединяются две таблицы.
Я добавил два новых поля startday и endday, теперь вам нужно только определить 1 строку на фазу беременности.Вы можете даже иметь перекрывающиеся фазы.
0 = день зачатия, 196 должен быть днем ​​рождения.Не забудьте указать достаточное количество дополнительных дней в случае позднего рождения :-).

3 голосов
/ 27 апреля 2011

Я бы не держал фактические "даты" в промежуточной таблице, но начинал и заканчивал ДНИ ... Например: первый месяц будет с 0 дня до 30 ... Второй месяц с 31 дня до 60 и т. Д.

Затем ваш запрос может запрашивать, где (синтаксис psuedo)

current_date() between Conception + Stage.StartDays 
                   and Conception + Stage.StopDays

в MySQL, его синтаксис будет

date_add( Conception, interval Stage.StartDays day ) as an example.

Таким образом, один человек, зачатый 1 января, будет в 4-м месяце, а кто-то, зачавший вчера, будет в первом месяце (или ноль в зависимости от того, как классифицируются «месяцы»).

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