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

Попытка — возвращает все регистрации с параметром 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>

Это должно быть просто СОЕДИНЕНИЕ между двумя таблицами. Покажите, пожалуйста, что вы пробовали.

Barmar 31.08.2024 00:54

@Barmar - я обновил свой вопрос, опубликованный мной запрос работает... но он возвращает только те регистрации, у которых reportDate = CURRENT WEEK .... это не полное решение, мне нужен оставшийся список регистраций, который будет выбираемые в поле выбора

George Richardson 31.08.2024 03:33
sqlfiddle.com/mysql/…
George Richardson 31.08.2024 03:36

Можете ли вы попробовать этот вариант: ВЫБЕРИТЕ 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 31.08.2024 11:20

@Hamdallah, ваш запрос возвращает правильные результаты, если вы укажете его как ответ, я могу отметить его. Остальное я смогу сделать отсюда.

George Richardson 31.08.2024 12:29
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
3
5
66
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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

Другие вопросы по теме