Попытка — возвращает все регистрации с параметром 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 схож с синтаксисом C, C++, Java и Perl.
Можете ли вы попробовать это?
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