Страницы

Поиск по вопросам

вторник, 25 декабря 2018 г.

Как найти незанятые области через запрос MySql

Приложил картинку: в базе хранятся закрашенные области (серый цвет), как координаты левого верхнего угла и правого нижнего, т.е. ЧЕТЫРЕ числа (х1,у1,х2,у2). Как запросом в базу MySql получить координаты свободной области, если условия такие:
начиная сверху слева найти свободную область размером 1х1 начиная сверху слева найти свободную область размером 2х2
То есть для п.1 ответ должен быть 0,0,1,1 (голубой квадратик) для п.2 = 6,0,8,2 (оранжевый квадратик)
Все, на что хватило знаний)) -это функцией MIN нахожу свободную координату по оси X, но в совокупности с осью Y это неправильно. И для поиска областей 2х2 поиск через MIN вообще не применим. Как вариант, думал создать еще одну таблицу с перечислением всех возможных точек (т.е. для данного квадрата это 10х10=100 строк) и ставить пометку - такие-то точки заняты, а такие-то нет и искать среди незанятых, но если размер поля надо будет увеличить (с 10х10 до например 100х100), то скорее всего начнутся задержки??? База:
DROP TABLE IF EXISTS `m_items`; CREATE TABLE `m_items` ( `id` int(11) NOT NULL, `x1` smallint(4) NOT NULL, `y1` smallint(4) NOT NULL, `x2` smallint(4) NOT NULL, `y2` smallint(4) NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO `m_items` (`id`, `x1`, `y1`, `x2`, `y2`) VALUES (1, 3, 0, 6, 4), (2, 8, 0, 9, 2), (3, 0, 1, 2, 2), (4, 0, 3, 2, 5), (5, 7, 3, 9, 7), (6, 1, 6, 6, 7), (7, 1, 8, 2, 10);


Ответ

Попробуйте так:
select x,y from c -- см. ответ @mnv left join m_items on x <= X2-1 and x+2 >= X1 and y <= Y2-1 and y+2 >= Y1 where x+2<10 and y+2<10 and id is null order by y, x;
+2 - это квадраты 3x3.
SQLFiddle

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

Отправить комментарий