Попытка — возвращает все регистрации с параметром 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>
@Barmar - я обновил свой вопрос, опубликованный мной запрос работает... но он возвращает только те регистрации, у которых reportDate = CURRENT WEEK .... это не полное решение, мне нужен оставшийся список регистраций, который будет выбираемые в поле выбора
Можете ли вы попробовать этот вариант: ВЫБЕРИТЕ r.registration, СЛУЧАЙ, КОГДА rp.registration НЕ НУЛЕВЫЙ, ТОГДА 'отключен' ELSE '' КОНЕЦ КАК статус ИЗ регистраций r LEFT JOIN отчеты rp ON r.registration = rp.registration И rp.reportDate BETWEEN CAST( TIMESTAMPADD(DAY, -(DAYOFWEEK(CURDATE())-2), CURDATE()) AS DATE) AND CAST(TIMESTAMPADD(DAY, 7-(DAYOFWEEK(CURDATE())-1), CURDATE()) AS DATE) ;
@Hamdallah, ваш запрос возвращает правильные результаты, если вы укажете его как ответ, я могу отметить его. Остальное я смогу сделать отсюда.






Можете ли вы попробовать это?
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;
Это должно быть просто СОЕДИНЕНИЕ между двумя таблицами. Покажите, пожалуйста, что вы пробовали.