MySQL — нахождение отдельного значения, но только если оно верно для определенных переменных

#mysql #sql

#mysql #sql

Вопрос:

Итак, у меня следующая таблица closing_days:

ID Имя Дата kdv_id
1 foo 2021-02-16 1
2 бар 2021-02-16 2
3 база 2021-02-16 3
4 qux 2021-02-17 3

Идентификатор, имя, дата, kdv_id, где kdv_id представляет местоположение.

Я хочу вернуть дату из closing_day, которая является общей для всех местоположений за определенный период. Мне сказали, что это можно сделать только путем запроса, но я просто не могу найти способ сделать это.

На данный момент у меня есть следующее:

 SELECT DISTINCT date FROM closing_day
   WHERE kdv_id IN (1, 2, 3)
     AND datum >= '2021-02-15'
     AND datum <= '2021-02-19'
 

Единственная проблема здесь заключается в том, что если одно из местоположений имеет дату в этом периоде, оно возвращается.
Я хочу возвращать дату только в том случае, если во всех местоположениях эта дата указана как closing_day.

Переход от образца данных: 2021-02-16 и 2021-02-17 будут возвращены оба.

Желаемый результат из образца данных: 2021-02-16

Насколько я вижу, мой единственный вариант — выбрать все даты из таблицы (то есть не только отдельные) и отслеживать все записи в массиве, и если день закрытия равен количеству (местоположениям) раз в массиве, это обычный день закрытия. Но да, это делается не только путем запроса.

Комментарии:

1. Пожалуйста, предоставьте образцы данных и желаемые результаты.

2. добавлены примеры данных и желаемых результатов

Ответ №1:

Вы хотите GROUP BY с HAVING предложением:

 SELECT date
FROM closing_day
WHERE kdv_id IN (x, y, z) AND
      datum >= '2021-02-15' AND
      datum <= '2021-02-19'
GROUP BY date
HAVING COUNT(DISTINCT kdv_id) = 3  -- number of items in `IN` list