Запрос MySQL для получения неданных для неназначенных дат

У меня есть таблица с еженедельными данными, которая выглядит так:

userID       Site             date
------      ------           ------
Smith    Ferris Wheel       2009-07-13
Jones   Outerspaceland      2009-07-13
LChar   Ferris Wheel       2009-07-14
Smith     Underworld        2009-07-16
Jones     Fish Bowl         2009-07-17
Munson    Go-Go Tech        2009-07-16

В настоящее время у меня есть PHP-скрипт, который сначала получает диапазон дат (понедельник-пятница), а затем выполняет запрос для каждого идентификатора пользователя для этого диапазона дат. Затем я просматриваю результаты и проверяю наличие пробелов между датами. Если есть пробел, он выводит дату, а сайт указан как «Оставайтесь дома». Он должен учитывать несколько дней подряд (например, если пользователь находится только в понедельник и пятницу на этой неделе), и он должен выполнять дополнительный шаг в конце каждой недели, чтобы убедиться, что если пользователь остается дома после Среда (таким образом, есть четверг и пятница, чтобы заполнить пробелы). Таким образом, он должен выполнить три проверки: одну для пользователей, не начинающихся в понедельник, одну для промежутков между днями и одну для пользователей, закончивших работу до пятницы... плюс он должен учитывать дни подряд для любой из этих ситуаций.

Сценарий в основном создает массив диапазона дат для проверки, и он отлично работал в течение нескольких месяцев. ОДНАКО

Мне было интересно, есть ли функция MySQL для возврата выходных для каждого пользователя? Чтобы я мог заполнить его «Оставайся дома» в запросе и не запускать странный сценарий, который вечно приходится объяснять другим людям, работающим со мной над моим сценарием?

Спасибо!


person Anthony    schedule 13.07.2009    source источник


Ответы (1)


Легко! Переверните запрос!

То есть:

  1. Создайте справочную таблицу с днями недели
  2. Создайте запрос, который выполняет LEFT_OUTER_JOIN в таблице поиска и вашей таблице DAYNAME (поле). То есть он вернет все строки из таблицы поиска и только те, которые совпадают в вашей таблице,,,

Я не уверен, хотите ли вы фильтровать по человеку... критерии будут выглядеть так: userid = 'person' или userid равен null

Полученные данные будут выглядеть так...

  1. РЯД НА ВСЕ ДНИ
  2. В строке идентификаторы пользователей будут существовать для непустых дней и будут нулевыми для пропущенных дней.
person CMB    schedule 14.07.2009
comment
Если у меня есть таблица только с понедельника по воскресенье, которую я могу использовать снова и снова, существует ли функция даты, которая на основе фактического диапазона дат изменит эти дни недели на фактические даты? Одна из моих целей состоит в том, чтобы иметь как можно больше, если не все, мой фактический html, возвращаемый SQL-запросом с использованием concat и еще много чего, поэтому, хотя использование вашей идеи помогает найти пропущенные дни, было бы идеально, если бы он вернул эти пропущенные дни недели как пропущенные даты (завернутые в теги html и т. д.). - person Anthony; 14.07.2009
comment
Да, можно получить и то, и другое. Включает ли ваша таблица данные только за неделю? Включите в запрос вычисляемый столбец, который выполняет расчет даты на основе даты начала (которую вы передаете). Существует также вариант UNION для небольшой таблицы с датами и группировкой для удаления дубликатов. - person CMB; 14.07.2009
comment
ЕСЛИ под данными за неделю вы имеете в виду, есть ли в таблице данные только за одну конкретную неделю, нет. Если вы имеете в виду, это только каждый запрос данных за одну неделю, обычно, но не всегда, так что нет снова. Я думаю, что мне придется согласиться с предложением Джоэла вместо таблицы дат. Я бы предпочел иметь более легкую таблицу всего с 7 значениями, но кажется, что, чтобы действительно получить все, что я хочу, без роскоши временных таблиц, мне нужно просто иметь таблицу значений 365 * 20 только каждый день года . - person Anthony; 15.07.2009
comment
Таблица дат подойдет. Если вы не хотите поддерживать данные о датах, вы могли бы даже выдумать их с помощью таблицы неполных дат... и т.д. или временные таблицы... Удачи - person CMB; 15.07.2009