Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > задача про шкафыю лучшее решение


Автор: Areostar 26.7.2020, 14:56
Допустим что имеется определённое количество шкафов. у каждого одинаковое количество полочек часть полочек занята книгами.
В наличии имеется база данных(в в таблице номер записи, номер шкафа, номер полочки) занятых полочек. Надо получить список свободных полочек.

Простое решение выбираем всю инфу о занятых полочках. сортируем по порядку. и перебором(количесто шкафов и полочек знаем) находим все что отсутствует!

Возможно ли как нибудь более элегантно?

Автор: миг 20.9.2020, 08:44
обязательно сортировать? можно просто пробежаться по таблице и запомнить  ID пустых полочек помещая их в массив или другую таблицу

Автор: Areostar 20.9.2020, 11:05
Смотря по обстоятельствам smile

Автор: Akina 21.9.2020, 11:19
Цитата(Areostar @  26.7.2020,  15:56 Найти цитируемый пост)
В наличии имеется база данных(в в таблице номер записи, номер шкафа, номер полочки) занятых полочек. Надо получить список свободных полочек.

Ну уже спрашивал же ты. И тебе чётко ответили, что ЭТИХ данных недостаточно - необходимо знать количество шкафов (или иметь их список) и количество полочек на шкаф.

А из таблицы базы данных (при наличии названных выше данных) требуемый список получается запросом с использованием рекурсивного CTE:

Код

WITH RECURSIVE
cte AS ( SELECT 1 num
         UNION ALL
         SELECT num +  
         FROM cte
         WHERE num < GREATEST(@shelf_amount, @closet_amount) )
SELECT t1.num as shelf, t2.num AS closet
FROM cte t1
CROSS JOIN cte t2
LEFT JOIN source_table src ON src.shelf = t1.num AND src.closet = t2.num
WHERE t1.num <= @shelf_amount
  AND t2.num <= @closet_amount
  AND src.id IS NULL


Если имеется служебная таблица с достаточным количеством последовательных натуральных чисел, то можно и не городить огород с CTE...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)