Как выбрать строки, которые сегодня являются событиями? - PullRequest
0 голосов
/ 20 августа 2011

У меня есть набор таблиц (телефонные книги, номера, дополнительные поля, экстрадаты)

  • телефонные книги - Список телефонных книг пользователей (username, book_id, title)
  • номера - Список номеров каждой телефонной книги (number_id, book_id, number, fullname)
  • extrafields - Список дополнительных полей (день рождения, адрес электронной почты, ...) и поля таблицы: field_id, title
  • extradatas - Список дополнительных данных дополнительных полей каждого номера (book_id, field_id, number_id, value)
  • отношения - Какое дополнительное поле принадлежит какой телефонной книге (book_id, field_id)

Представьте себе пользователя, у которого есть телефонная книга и дополнительное поле дня рождения.
Как я могу выбрать номера, у которых сегодня день рождения?

РЕДАКТИРОВАТЬ: Я указал uname, book_id, field_id в моих руках (из сценария PHP), и результаты должны быть ограничены этими значениями.

Обратите внимание, что я сохраняю поля даты в метке времени Unix, а тип extradatas. value - varchar.
Это - самое сложное математическое соединение-выбор в моей жизни (я думаю).

Почему математика? : потому что я хочу вычислить номер дня из метки времени Unix, без необходимости использовать функции (например, DATE_FORMAT)

Ответы [ 2 ]

0 голосов
/ 20 августа 2011
SELECT DISTINCT n.number
FROM phonebooks p
INNER JOIN  numbers n ON n.book_id = p.book_id
INNER JOIN extradatas ed ON ed.book_id = n.book_id
INNER JOIN extrafields ef ON ef.field_id = ed.field_id AND ef.title = 'birthday'
WHERE p.book_id = :book_id
    AND p.username = :username
    AND ed.value BETWEEN unix_timestamp(DATE(now()))
        AND unix_timestamp(DATE(now()) + INTERVAL 1 DAY);

Обратите внимание, что единственное существенное различие (которое я вижу) между моим ответом и @Andrej L - это то, как я сравниваю даты.Для больших наборов данных решение @Andrej L потребует преобразования каждого дня рождения в системе с использованием DATEFORMAT.Мое решение должно позволять MySQL оценивать сравнения один раз, заранее и, возможно, использовать индекс extrafields.value.

0 голосов
/ 20 августа 2011

Попробуйте Торунь:

Select number from numbers as n inner join extradatas e on (n.number_id=e.number_id and  n.book_id=e.book_id) inner join extrafields ex on e.field_id=ex.field_id
where ex.title='birthday' and DATE_FORMAT(ex.value, '%Y-%m-%d')=DATE_FORMAT(NOW(), '%Y-%m-%d')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...