Попытка — возвращает все регистрации с параметром reportDate = CURRENT WEEK.
SELECT *
FROM registrations
LEFT JOIN reports on registrations.registration=reports.registration
WHERE reports.reportDate
between cast(timestampadd(SQL_TSI_DAY, -(dayofweek(curdate())-2), curdate()) as date)
and cast(timestampadd(SQL_TSI_DAY, 7-(dayofweek(curdate())-1), curdate()) as date)
Я хочу добиться следующего, но не знаю, как этого добиться с помощью PHP.
Сначала получите все «регистрации» из таблицы «Регистрации»,
затем проверьте, существуют ли регистрации в таблице Reports WHERE reportDate, равной текущей НЕДЕЛЕ
(т. е. текущая неделя — понедельник-воскресенье, в сегодняшнее время и дату, которые будут соответствовать дате с 26 августа по 1 сентября).
наконец, отобразите все регистрации в выбранных входных данных (должны быть отображены, поскольку выбранные входные данные находятся дальше в html-файле), а те, у которых есть reportDate = текущая неделя, будут видны, но отключены.
Регистрации
Отчеты
в приведенном выше примере регистрация EXAMPLE и EXAMPLE3 должна быть видна, но отключена, а EXAMPLE2 должен быть доступен для клика в поле выбора в зависимости от времени публикации и ТЕКУЩЕЙ НЕДЕЛИ этого вопроса. Что должно получиться, как в приведенном ниже коде
<select oncopy = "return false" id = "inspectReg" name = "inspectReg" class = "reg-control">
*Somewhat...a for each loop? or while?*
<option value = "EXAMPLE" disabled>EXAMPLE</option> (record exists dated 27th - so disabled)
<option value = "EXAMPLE2">EXAMPLE2</option> (record for current week does not exist)
<option value = "EXAMPLE3" disabled>EXAMPLE3</option> (record exists dated 27th - so disabled)
</select>
🤔 А знаете ли вы, что...
PHP предоставляет множество инструментов для отладки кода, таких как Xdebug.
Можете ли вы попробовать это?
SELECT
r.registration,
CASE WHEN rp.registration IS NOT NULL THEN 'disabled' ELSE '' END AS status
FROM registrations r
LEFT JOIN reports rp
ON r.registration = rp.registration
AND rp.reportDate BETWEEN CAST(TIMESTAMPADD(DAY, -(DAYOFWEEK(CURDATE())-2), CURDATE()) AS DATE)
AND CAST(TIMESTAMPADD(DAY, 7-(DAYOFWEEK(CURDATE())-1), CURDATE()) AS DATE);
Ваша главная ошибка — это ваша WHERE
оговорка. Если регистрация не имеет совпадений в отчетах, вы присоединяетесь к пустой строке отчета (т. е. все столбцы имеют значение NULL). Затем в предложении WHERE
вы ограничиваете результаты строками определенных отчетов report.reportDates. Это отклоняет все внешние объединенные строки, и ваше соединение превращается, таким образом, в простое внутреннее соединение. При внешнем соединении строк используйте критерии в предложении ON
, а не в предложении WHERE
.
В любом случае, при проверке существования совпадения мы предпочитаем EXISTS
соединениям:
SELECT
rg.*,
EXISTS
(
SELECT null
FROM reports rp
WHERE rp.registration = rg.registration
AND YEARWEEK(rp.reportDate, 1) = YEARWEEK(CURDATE(), 1)
) AS has_current_week_report_date
FROM registrations rg;
Демо: https://dbfiddle.uk/6LaRUFgs