Вывод дней рождения - MySQL

Узнай цену своей работы

Формулировка задачи:

Ребята нужна помощь. Есть база с таблицей. В ней поле

day

в формате

DATE

. Как вывести например 10 пользователей у которых ближайший месяц и день рождение. В общем, что я делаю:
$sql = "SELECT * FROM users WHERE DATE_FORMAT( `day`  , '%m%d' ) > '".date("md")."' ORDER BY  DATE_FORMAT( `day`  , '%m%d' ) LIMIT 10";

Сама проблема.

Когда например сегодня январь, то мне выводит 10 человек у которых в январе, феврале др и тд. Но когда декабрь и например только у одного человека др, то он и выводит только одного, он не выводит тех людей у которых др в январе и феврале.

Решение задачи: «Вывод дней рождения»

textual
Листинг программы
SELECT 
DAYOFYEAR(`day`) + CASE
            WHEN DAYOFYEAR(`day`) < DAYOFYEAR(CURDATE()) THEN 365
            ELSE 0
        END AS rn, users.*
FROM users 
ORDER BY rn
LIMIT 10

Объяснение кода листинга программы

Код написан на SQL (Structured Query Language), который является стандартным языком запросов к реляционным базам данных. В данном коде реализуется функция, которая выводит дни рождения пользователей. Вот список действий, которые выполняются в этом коде:

  1. Выбираются все поля из таблицы users.
  2. Рассчитывается относительная позиция дня в году (DAYOFYEAR(day)).
  3. Сравнивается относительная позиция дня в году с относительной позицией текущего дня в году (DAYOFYEAR(CURDATE())).
  4. Если текущий день находится раньше дня рождения, то к относительной позиции дня рождения добавляется 365 (количество дней в году).
  5. Если текущий день находится позже или в тот же день, что и день рождения, то к относительной позиции дня рождения добавляется 0.
  6. Рассчитанное значение относительной позиции дня рождения сохраняется в новом столбце rn.
  7. Таблица users сортируется по столбцу rn.
  8. Выводятся первые 10 записей. Вот как выглядит код с комментариями и выделением названий и значений переменных в виде списка:
  9. DAYOFYEAR(day) + CASE             WHEN DAYOFYEAR(day) < DAYOFYEAR(CURDATE()) THEN 365             ELSE 0         END AS rn, - Вычисляемое значение, которое представляет собой относительную позицию дня рождения в году с учетом текущего года. Если день рождения еще не наступил, то добавляется 365 (количество дней в году). Если день рождения уже прошел, то добавляется 0.
  10. users.* - Все поля из таблицы users выводятся в результате запроса.
  11. ORDER BY rn - Результат запроса сортируется по столбцу rn, который содержит относительные позиции дней рождения в году.
  12. LIMIT 10 - Выводятся первые 10 записей.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4 из 5