Возвращать строки тогда и только тогда, когда все строки с одинаковыми именами доступны в течение диапазона дат.

У меня есть следующая таблица (которую я не могу изменить)

я быназваниедатаимеется в наличии
1Книга_12019-10-11Д
2Книга_12019-10-12Д
3Книга_12019-10-13Д
4Книга_12019-10-14Д
5Книга_22019-10-11Д
6Книга_22019-10-12Д
7Книга_22019-10-13Д
8Книга_32019-10-11Д
9Книга_32019-10-12Н
10Книга_32019-10-13Д

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

я быназваниедатаимеется в наличии
1Книга_12019-10-11Д
2Книга_12019-10-12Д
3Книга_12019-10-13Д
5Книга_22019-10-11Д
6Книга_22019-10-12Д
7Книга_22019-10-13Д

Обратите внимание, что Книга_3 недоступна 12 октября 2019 г., поэтому я не могу ее вернуть. Возможно с SQL?

Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
0
28
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете использовать подзапрос с BOOL_AND, чтобы проверить, что available является true для всех date для книги:

SELECT *
FROM books
WHERE date BETWEEN '2019-10-11' AND '2019-10-13'
  AND name IN (
  SELECT name
  FROM books
  WHERE date BETWEEN '2019-10-11' AND '2019-10-13'
  GROUP BY name
  HAVING BOOL_AND(available)  -- or BOOL_AND(available = 'Y') if the column is not a BOOLEAN
);
я быназваниедатаимеется в наличии
1Книга_12019-10-11T00:00:00.000Zистинный
2Книга_12019-10-12T00:00:00.000Zистинный
3Книга_12019-10-13T00:00:00.000Zистинный
5Книга_22019-10-11T00:00:00.000Zистинный
6Книга_22019-10-12T00:00:00.000Zистинный
7Книга_22019-10-13T00:00:00.000Zистинный

Просмотр на скрипте БД

Большое спасибо. Еще один вопрос, пожалуйста, если «доступно» в исходном столбце не является логическим значением, а скорее количеством доступных копий, поэтому, если 0 означает, что он недоступен, а доступно больше нуля, как мне это сделать?

Drawio 09.04.2022 13:29

@Drawio: вы можете использовать HAVING BOOL_AND(available > 0), чтобы преобразовать количество копий в логический флаг.

Marth 09.04.2022 13:30

Вы можете попробовать использовать агрегированную оконную функцию в подзапросе

SELECT *
FROM (
 SELECT *,
       MAX(CASE WHEN available = 'N' THEN 1 END) 
        OVER(PARTITION BY name) is_available
 FROM T
) t1
WHERE is_available IS NULL AND 
date BETWEEN '2019-10-11' AND '2019-10-13'

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