Консультация № 181441
19.12.2010, 13:15
91.09 руб.
0 5 1
Здравствуйте, уважаемые эксперты! Прошу Вас ответить на следующий вопрос:
Есть таблица `cells` в базе данных MySQL. Поля id (serial), x (int), y(int), status (tinyint). В табице уже есть миллион записей что чоотвечтвует матрице 1000Х1000. Соотвестенно "х" и "у" это коорднаты в матрице (Например х=324, у=300), а status может быть 1(занятая ячйка) или 0(свободная). В матрице ячейки могут образовывать квадратные области, Например, коррдинаты 0,0 и размер квадратной области 5 значит что мы имеем квадратную область в которую входять ячейки с 0,0; 0,1; 0,2; 0,3; 0,4; 1,0; 1,1; и т.д короче в этой квадратной области 25 ячеек занятых.
Вообщем думаю суть таблицы ясна: в ней есть ячейки, некоторые из них свободны, а некоторые заняты, и кажадая имеет свои координаты в системе координат (или матрице, кому как удобнее).
Внимание вопрос: Как с помощю SQL запроса мне выбрать свободную область (например 4Х4). Тоесть мне надо выбрать четыре ряда, которые имеют неприрывную последовательно по "х" и по "у", и где "status" = 0. Все что у меня есть э то размер области (количеста ячеек).

Спасибо.

Обсуждение

Неизвестный
19.12.2010, 18:18
общий
это ответ
Здравствуйте, Александр!

Привожу решение, которое выведет Вам все левые верхние координаты углов квадратов. В SQL-запросе замените "5" во всех местах на нужный Вам размер квадрата:

Код:
select yc, xc
from
(
select y, xc from cells join (select distinct x as xc from cells) xx
where x >= xc and x < xc+5
group by y, xc
having sum(status) = 0 and count(*) = 5
) xgr join (select distinct y as yc from cells) yy
where y >= yc and y < yc+5
group by yc, xc
having count(*) = 5
5
Неизвестный
19.12.2010, 19:14
общий
Спасибо, за хороший ответ. Допустим надо найти свободную квадратную область, которая являеться максильно приближонной к определенной квадратной области. Тоесть у меня есть "х" и "у" и размер (например 7) какойто области, и надо найти х,у (то что мы находим в решении сверху), но не все координаты, а лишб приближонную к той области что у нас есть.
Спасибо.
(постараюсь у Украины сказать спасибо через смс, пока проблемы и оплатой.)
Неизвестный
19.12.2010, 21:06
общий
Александр, не совсем понятно что подразумевается под словом "приближенной"? Если хотите получить решение другой задачи, опишите подробней, пожалуйста!
Сейчас работает так: если есть квадрат 7х7 и мы ищем квадраты 6х6, то получим 4 таких квадрата, все они лежат внутри квадрата 7х7 и все они одинаково приближены к нему...
Неизвестный
19.12.2010, 21:20
общий
Я думаю нет необходимости описывать еще один вопрос по этой теме. Ваше решение достаточно исчерпующе. Под приближонной я понимаю, когда мы вытягиваем не все квадраты, а только тот который находиться к определенной точке ближе всех по х И по у, например 500,500.
Спасибо.
Неизвестный
20.12.2010, 06:59
общий
Если задана точка (100;200), то имеем максимально близкую из полученного набора следующую точку:

Код:
select yc, xc
from
(
select y, xc from cells join (select distinct x as xc from cells) xx
where x >= xc and x < xc+5
group by y, xc
having sum(status) = 0 and count(*) = 5
) xgr join (select distinct y as yc from cells) yy
where y >= yc and y < yc+5
group by yc, xc
having count(*) = 5
order by ((yc-200)*(yc-200)+(xc-100)*(xc-100))
limit 1
Форма ответа