Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Вывод юнита, если все даты промежутка активны / 14 сообщений из 14, страница 1 из 1
22.11.2017, 11:25
    #39557371
PavelKe
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод юнита, если все даты промежутка активны
Всем привет, есть две таблицы, одна - это юниты, вторая - это даты для юнитов.

Как сделать следующее:
Вывести все юниты, все даты которых свободны и входят в введённый промежуток.

Пока вывожу только свободные даты:
Код: sql
1.
2.
3.
4.
SELECT unit.*
FROM unit as u
INNER JOIN dates AS d ON (d.unit_id = u.id)
WHERE d.status=1 AND date>= начальная_дата AND date<=конечная_дата
...
Рейтинг: 0 / 0
22.11.2017, 11:39
    #39557384
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод юнита, если все даты промежутка активны
PavelKeесть две таблицы, одна - это юниты, вторая - это даты для юнитовПример данных в студию. В теге Table, и проверить вид предпросмотром, пожалуйста...
...
Рейтинг: 0 / 0
22.11.2017, 12:18
    #39557404
PavelKe
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод юнита, если все даты промежутка активны
Структура таблиц
...
Рейтинг: 0 / 0
22.11.2017, 12:18
    #39557406
PavelKe
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод юнита, если все даты промежутка активны
Таблица дат
...
Рейтинг: 0 / 0
22.11.2017, 12:20
    #39557408
PavelKe
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод юнита, если все даты промежутка активны
Akina,
Код: sql
1.
2.
3.
4.
5.
select `unit_availability_date`.`booking_date` 
FROM `unit_availability_date` 
where (`booking_date` >= '2017-12-30' AND `booking_date` <= '2018-01-05' AND `status_id` = 1 AND `unit_id` = 2 ) 
OR (`booking_date`=`start_date` AND `start_date` >= '2017-12-30' AND `start_date` <= '2018-01-05' AND `status_id` = 2 AND `unit_id` = 2 )
 OR (`booking_date`=`end_date` AND `end_date` >= '2017-12-30' AND `end_date` <= '2018-01-05' AND `status_id` = 2 AND `unit_id` = 2 )
...
Рейтинг: 0 / 0
22.11.2017, 12:45
    #39557429
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод юнита, если все даты промежутка активны
Блин, да что ж вы все не можете без фотографий! да непременно с футбольное поле размером... ни хрена ж из них всё равно не видно. И таблиц в схеме три, хотя кто-то говорил, что две.

Структуру таблиц дают в виде SHOW CREATE TABLE в теге SRC. Пример наполнения таблиц - в теге Table (разделитель полей запятая). И обязательно к примеру наполнения таблиц в том же теге дают желаемый на именно этих данных результат, сопровождая объяснением логики его получения.

А по фотографии тебя пусть знахари лечат...
...
Рейтинг: 0 / 0
22.11.2017, 14:11
    #39557516
PavelKe
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод юнита, если все даты промежутка активны
Akina, понял, извини
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
CREATE TABLE IF NOT EXISTS `unit_availability_date` (
`id` int(10) unsigned NOT NULL,
  `unit_id` int(10) unsigned NOT NULL,
  `booking_date` date NOT NULL,
  `start_date` date DEFAULT NULL,
  `end_date` date DEFAULT NULL,
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `deleted_at` timestamp NULL DEFAULT NULL,
  `status_id` int(10) unsigned NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

ALTER TABLE `unit_availability_date`
 ADD PRIMARY KEY (`id`), ADD KEY `unit_availability_date_unit_id` (`unit_id`), ADD KEY `unit_availability_date_deleted_at` (`deleted_at`), ADD KEY `unit_availability_date_status_id` (`status_id`);

ALTER TABLE `unit_availability_date`
MODIFY `id` int(10) unsigned NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=1;

ALTER TABLE `unit_availability_date`
ADD CONSTRAINT `unit_availability_date_status_id_foreign` FOREIGN KEY (`status_id`) REFERENCES `unit_availability_date_status` (`id`),
ADD CONSTRAINT `unit_availability_date_unit_id_foreign` FOREIGN KEY (`unit_id`) REFERENCES `unit` (`id`);




Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
CREATE TABLE IF NOT EXISTS `unit` (
`id` int(10) unsigned NOT NULL,
  `hotel_id` int(10) unsigned NOT NULL,
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `deleted_at` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

ALTER TABLE `unit`
 ADD PRIMARY KEY (`id`), ADD KEY `unit_hotel_id` (`hotel_id`), ADD KEY `unit_deleted_at` (`deleted_at`);

ALTER TABLE `unit`
MODIFY `id` int(10) unsigned NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=1;


ALTER TABLE `unit`
ADD CONSTRAINT `unit_hotel_id_foreign` FOREIGN KEY (`hotel_id`) REFERENCES `hotel` (`id`);
...
Рейтинг: 0 / 0
22.11.2017, 16:50
    #39557690
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод юнита, если все даты промежутка активны
Отлично. Как я понимаю, третья таблица не нужна.
Теперь ещё
AkinaПример наполнения таблиц - в теге Table (разделитель полей запятая). И обязательно к примеру наполнения таблиц в том же теге дают желаемый на именно этих данных результат, сопровождая объяснением логики его получения.
Ну грубо - по 5-7 записей для каждой таблицы, и чтобы туда по минимуму попали все возможные сочетания данных.
...
Рейтинг: 0 / 0
22.11.2017, 17:12
    #39557713
PavelKe
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод юнита, если все даты промежутка активны
Akina,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
INSERT INTO `unit` (`id`, `hotel_id`, `created_at`, `updated_at`, `deleted_at`) VALUES
(1, 2, '2017-11-18 11:52:22', '2017-11-18 11:52:22', NULL),
(2, 3, '2017-11-18 11:52:22', '2017-11-18 11:52:22', NULL),
(3, 4, '2017-11-18 11:52:22', '2017-11-18 11:52:22', NULL),
(4, 5, '2017-11-18 11:52:22', '2017-11-18 11:52:22', NULL),
(5, 6, '2017-11-18 11:52:22', '2017-11-18 11:52:22', NULL),
(6, 7, '2017-11-18 11:52:22', '2017-11-18 11:52:22', NULL);
-- (id, Ид Отеля(для понимания не нужно), время создания, время изменения, признак удаления)

INSERT INTO `unit_availability_date` (`id`, `unit_id`, `booking_date`, `start_date`, `end_date`, `created_at`, `updated_at`, `deleted_at`, `status_id`) VALUES
(111964, 2, '2017-11-19', '2017-11-16', '2017-11-30', '2017-11-19 14:29:42', '2017-11-19 14:29:42', NULL, 2),
(111965, 2, '2017-11-20', '2017-11-16', '2017-11-30', '2017-11-19 14:29:42', '2017-11-19 14:29:42', NULL, 2),
(111966, 2, '2017-11-21', '2017-11-16', '2017-11-30', '2017-11-19 14:29:42', '2017-11-19 14:29:42', NULL, 2),
(111967, 2, '2017-11-22', '2017-11-16', '2017-11-30', '2017-11-19 14:29:42', '2017-11-19 14:29:42', NULL, 2),
(111968, 2, '2017-11-23', '2017-11-16', '2017-11-30', '2017-11-19 14:29:42', '2017-11-19 14:29:42', NULL, 2);
--(id, id юнита, дата для бронирования(свободные и занятые даты идентичны), дата старта брони(только для занятых дат), дата конца брони(только для свободных дат), `created_at`, `updated_at`, `deleted_at`, статус даты(1 - свободна, 2 - занята, 3 - заморожена)
...
Рейтинг: 0 / 0
22.11.2017, 17:14
    #39557715
PavelKe
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод юнита, если все даты промежутка активны
Akina,

Код: sql
1.
2.
3.
4.
INSERT INTO `unit_availability_date` (`id`, `unit_id`, `booking_date`, `start_date`, `end_date`, `created_at`, `updated_at`, `deleted_at`, `status_id`) VALUES
(111975, 2, '2017-11-30', '2017-11-16', '2017-11-30', '2017-11-19 14:29:42', '2017-11-19 14:29:42', NULL, 2),
(111980, 2, '2017-12-05', NULL, NULL, '2017-11-19 14:29:42', '2017-11-19 14:29:42', NULL, 1),
(111981, 2, '2017-12-06', NULL, NULL, '2017-11-19 14:29:42', '2017-11-19 14:29:42', NULL, 1);
...
Рейтинг: 0 / 0
22.11.2017, 21:04
    #39557865
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод юнита, если все даты промежутка активны
Итак, получается, что для сути требуемого запроса таблица unit в общем-то и не нужна? то есть из неё просто получаем дополнительные данные по конкретному номеру конкретного отеля, а весь отбор можно вести по unit_availability_date, так?

Далее - собственно таблица unit_availability_date, как я понимаю, содержит информацию о бронировании номера, пошинкованном (нафига?) на отдельные дни.

В свете этого фразу "Вывести все юниты, все даты которых свободны и входят в введённый промежуток." следует понимать так: "Вывести те юниты, для которых в заданный период ВСЕ записи имеют статус даты 1 (свободна)", верно?

Если догадки верны, то я бы использовал, например, такой запрос:

Код: sql
1.
2.
3.
4.
5.
6.
SELECT unit.*
FROM unit u
JOIN unit_availability_date d ON d.unit_id = u.id
WHERE d.date>= начальная_дата AND d.date<=конечная_дата /* или BETWEEN */
GROUP BY u.id
HAVING SUM(d.status = 1) = COUNT(*)



Ну и добавил необходимый для эффективной работы запроса индекс.
...
Рейтинг: 0 / 0
22.11.2017, 21:45
    #39557889
PavelKe
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод юнита, если все даты промежутка активны
Akina,

не совсем раотает, выводит просто все unit, у которых, есть свободные даты в данном промежутке, а нужно чтобы все даты были со статусом 1

такой у меня запрос
Код: sql
1.
2.
3.
4.
5.
6.
SELECT `unit`.* 
FROM `unit`
JOIN `unit_availability_date` ON unit_availability_date.unit_id = `unit`.id
WHERE (`booking_date` >= '2017-12-30' AND `booking_date` <= '2018-01-05' AND `status_id` = 1 )
GROUP BY `unit`.id
HAVING SUM(unit_availability_date.status_id = 1) = COUNT(*)
...
Рейтинг: 0 / 0
22.11.2017, 21:52
    #39557891
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод юнита, если все даты промежутка активны
PavelKeтакой у меня запросА теперь ВНИМАТЕЛЬНО сравни запросы и выброси из своего запроса всё лишнее.
...
Рейтинг: 0 / 0
22.11.2017, 22:04
    #39557899
PavelKe
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод юнита, если все даты промежутка активны
Akina,

Огромное спасибо) что-то с внимательностью у меня
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Вывод юнита, если все даты промежутка активны / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]