Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> запросы, продолжение, др. упр. по SQL 
:(
    Опции темы
bilbobagginz
Дата 2.8.2008, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: нет
Всего: 317



продолжим далее....
определены сл. отношения (реляции):
Код

-- точка
CREATE TABLE point(
    p_id INTEGER,
    x INTEGER,
    y INTEGER,
    PRIMARY KEY (p_id));
-- ребро
CREATE TABLE edge(
    e_id INTEGER,
    p1 INTEGER,
    p2 INTEGER,
    PRIMARY KEY (e_id),
    FOREIGN KEY (p1) REFERENCES point(p_id),
    FOREIGN KEY (p2) REFERENCES point(p_id));
-- форма
CREATE TABLE shape(
    s_id INTEGER,
    e_id INTEGER,
    PRIMARY KEY (s_id, e_id),
    FOREIGN KEY (e_id) REFERENCES edge);

данные и эти таблицы приведены тут: http://rafb.net/p/khFCX327.html
выглядит это примерно так:
user posted image

нужно создать запрос печатающий формы (т.е. их s_id), в которых присутствует треугольник.
математически - существует 8 комбинаций из 3 отрезков создать тругольник.
для выделения одного из них, проще всего выбрать из восьми того, который имеет e_id по возрастающей.
теперь... я научился выводить все треугольники по ребрам:
Код

SELECT l.e_id AS L_id, c.e_id AS C_id, r.e_id AS R_id
FROM edge AS l, edge AS c, edge AS r
WHERE  (
(l.e_id < c.e_id AND c.e_id < r.e_id) AND
((l.p1=r.p2 AND l.p2=c.p1 AND c.p2=r.p1) OR
(l.p1=r.p1 AND l.p2=c.p1 AND c.p2=r.p2) OR
(l.p1=r.p2 AND l.p2=c.p2 AND c.p1=r.p1) OR
(l.p1=r.p1 AND l.p2=c.p2 AND c.p1=r.p2) OR
(l.p2=r.p2 AND l.p1=c.p1 AND c.p2=r.p1) OR
(l.p2=r.p1 AND l.p1=c.p1 AND c.p2=r.p2) OR
(l.p2=r.p2 AND l.p1=c.p2 AND c.p1=r.p1) OR
(l.p2=r.p1 AND l.p1=c.p2 AND c.p1=r.p2)));

получаю всё правильно.
но надо мне искать не это, a список s_id.

не сильно обольщайтесь рисунком, на рисунке все шейпы - многогранны.
а может быть (в общем случае) какое-то "оторванное ребро", или весь шейп - группа несоедниенных ребер.
кроме этого, моим макаром можно найти такие ребра, которые будут в разных шейпах, и образуют треугольник. а это не лады.
надо пройтись по шейпам, и на основании ребер в шейпах сделать проверку.
никак не могу привыкнуть к подходу БД.



--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
Nigel
Дата 3.8.2008, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


познаю мир
**


Профиль
Группа: Участник
Сообщений: 515
Регистрация: 20.11.2007

Репутация: нет
Всего: 19



Зачем писать такое, что тут выбирается?
Код

SELECT l.e_id AS L_id, c.e_id AS C_id, r.e_id AS R_id
FROM edge AS l, edge AS c, edge AS r

Насколько я понял, нужно отобразить список фигур с относящимся к ним ребрам. Это можно сделать так
Код

SELECT s_id, e.p1, e.p2
FROM `shape` AS s
INNER JOIN edge AS e ON s.e_id = e.e_id order by s_id


Это сообщение отредактировал(а) Nigel - 3.8.2008, 14:08
PM MAIL   Вверх
bilbobagginz
Дата 3.8.2008, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: нет
Всего: 317



Цитата(Nigel @  3.8.2008,  14:06 Найти цитируемый пост)
Насколько я понял, нужно отобразить список фигур с относящимся к ним ребрам. Это можно сделать так

да, нужно. видимо ты прав.
перефразирую задачку:
есть 3 таблицы, как определено выше (данные я придумал сам - для проверки)
сначала нужно распечатать список фигур, в которых присутствует тругольник, и это - частный случай.
в следующем вопросе спрашивают найти фигуры, которые являются "замкнутой" группой отрезков, т.е. полигоны.
поэтому я хотел бы попробовать решить сначала этот вопрос, а треугольник - как частный случай.

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

потом я предположительно должен буду как-то по ним пройтись.

когда мне надо искать треугольник - это легко.
просто этот заджойненный кусок дуплицировать 3 раза и сделать проверки, как я предложил изначально.

в конце распечатать только s_id.

скажи если я правильно понял идею...




--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
Nigel
Дата 3.8.2008, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


познаю мир
**


Профиль
Группа: Участник
Сообщений: 515
Регистрация: 20.11.2007

Репутация: нет
Всего: 19



Определение треугольников и полигонов нужно сделать при помощи sql? Или разрешается использовать ЯП?
PM MAIL   Вверх
bilbobagginz
Дата 4.8.2008, 01:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: нет
Всего: 317



Цитата(Nigel @  3.8.2008,  18:36 Найти цитируемый пост)
Определение треугольников и полигонов нужно сделать при помощи sql? Или разрешается использовать ЯП? 

всё через SQL 


--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
vlksm
Дата 3.9.2008, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 19.6.2007

Репутация: нет
Всего: нет



Количество ребер в shape не ограничено?
Если вы используете SQL2005, то можно составить
рекурсивный запрос, но работать он будет небыстро...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.0612 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.