Проверьте, существует ли запись из одной таблицы в другой, и отключите эту опцию

Попытка — возвращает все регистрации с параметром 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 = текущая неделя, будут видны, но отключены.

Регистрации

идентификатор регистрация 1 ПРИМЕР 2 ПРИМЕР 2 3 ПРИМЕР3

Отчеты

идентификатор регистрация отчетДата 1 ПРИМЕР 2024-08-19 2 ПРИМЕР 2024-08-22 3 ПРИМЕР 2 2024-08-22 4 ПРИМЕР3 2024-08-22 5 ПРИМЕР 2024-08-27 6 ПРИМЕР3 2024-08-27

в приведенном выше примере регистрация 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.


66
2

Ответы:

Решено

Можете ли вы попробовать это?

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