Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

как организовать SQL запрос [MSSQL, MySQL]


Страницы:   1 2

Undert ©   (2003-12-22 12:33:00) 

Помогите примером в следующем:
Существует некая система, где:
Есть огромная таблица, называемая EVENTS.
Есть пользовательские таблицы (неограниченное количество), называемые usr1.. usrN.
Есть таблица ACCESS, где 3 столбца ID, UID, TID (ID - AtoInc - неиспользуется, UID - ID пользователя, TID - ID страницы). Таблица ACCESSопределяет имеет ли пользователь право доступа к странице с ID - TID.

При каком - то событии, например добавлении сообщения в форуме или чате, в таблицу EVENTSсбрасывается то, что произошло изменение, к какой странице оно принадлежит и кто его сделал.

Соответственно, каждые 2 минуты нахождения пользователя на любой странице идёт перебор таблицы EVENTS:
1. Есть ли доступ у данного пользовател к странице данного события, если не нет, переходим дальше и к п.1
2. Является ли он автором данного события, если нет - переходим дальше и к п.1
2. Присутствует ли данное событие в его пользовательсткой таблице, если да переходим дальше и к п.1
Выводим сообщение что появились изменения в системе

Собственно то что я хотел: как одним запросом проверить п.1,2,3 ?


Undert   (2003-12-22 13:56:00) [21]

Причём он же не должен знать про изменения которые произошли в ветке куда у него нету доступа


Undert   (2003-12-22 13:55:00) [22]


> JibSkeart ©
> paul_k ©


Ну я только из сделанного делаю ... вот почему я нормально не могу сделать запрос, всё тормозит итп ... тот кто делал - много чего наделал :(( Его форум полностью пришлось переделать из-за тормозов ... а вот с событиями я ничего не могу поделать ... фишка то в том,

Есть древоструктурный набор страниц, проще дерево. Каждая ветка этого дерева - страница, которая имеет форум. Каждый пользователь имеет доступ только к определённой ветке дерева. При входе в систему он должен видеть появилось ли чё нового в той или иной ветке. Вот так вот...


paul_k   (2003-12-22 13:50:00) [23]

по моему тут глубже.
не очень хорошо сформированы требования к работе ПО. "хорошее" проектирование бд - это уже следствие


JibSkeart   (2003-12-22 13:46:00) [24]

ну да имхо не очень хорошо спроектированая бд :(


paul_k   (2003-12-22 13:42:00) [25]

При такой постановке задачи вообще-то мало вероятно что будет работать хоть что-нибудь.... или по крайней мере эффективно работать точно не будет


JibSkeart   (2003-12-22 13:40:00) [26]

вот это уже должно сработать :)


paul_k   (2003-12-22 13:38:00) [27]

select *
from t1
where not exists(select 1
from t2
where t2.id=t1.id)
and exists(select 1
from t3
where t3.tid=t1.tid
and t2.uid = userid)


JibSkeart   (2003-12-22 13:38:00) [28]

ну это же я уже тебе писал ...

select * from table1,table3 where not exists (select * from table2 where tablw1.id=table2.id ) and ...

значение столбеца tid присутствует в таблице3 в виде tid|user.

значение столбца чьей какой таблички (сорри не понял)
и как значение присутсвует в третьей табличке .
что то запутанно :)


paul_k   (2003-12-22 13:34:00) [29]

так это.. запрос написать надо полностью и чтоб работал?
или подсказать в какую сторону копать?
Запрос он существует для выбора - изменения - добавления - удаления данных. (если я не прав то мастера поправят)
я так понял, что в зависимости от прав доступа надо вернуть или не вернуть данные, при чем СУБД - MSSQL
тогда пишем следующее
if exists(select 1 from .... (набор условий проверки)
select ... (выбор данных)
else if и так далее

Когструкцию "Case" тоже никто не отменял
select case
when <учловие> then <значение>
end
Что удобнее в данном случае смотреть тебе
перебирать все значения таблицы по моему - моветон в данном случае.


Undert   (2003-12-22 13:30:00) [30]

Буду проще :) :

Даны таблица1, таблица2, таблица3, переменная User
Необходимо взять из таблицы1 все строки, которые не присутствуют в таблице2 и где значение столбеца tid присутствует в таблице3 в виде tid|user.


Johnmen   (2003-12-22 13:22:00) [31]

>Undert ©

SELECT *
FROM ACCESS
JOIN EVENTS ON EVENTS.owner=ACCESS.UID


Вообще говоря, постановка задачи весьма расплывчата...
Попробуй максимально формализовать ее.


Undert   (2003-12-22 12:55:00) [32]


> Johnmen ©


1. Очепятка =)
2. Если присутствует строка в ACCESSUID|TID, где uid - ID пользователя, TID - ID страницы, то значит пользователь с этим ID имеет доступ к странице TID
3. В таблице EVENTSесть соответствующий столбец owner


Johnmen   (2003-12-22 12:49:00) [33]

- а где пункт 3 ? :)
- чем определяется "Есть ли доступ" ?
- чем определяется "Является ли он автором" ?

"Ты не умничай, ты рукой покажи" (c) известный анекдот


paul_k   (2003-12-22 12:48:00) [34]

первое что приходит в голову. не уверен что оптимальное решение
select 1
from ...
where exists (select 1 where 1-е условие)
and exists (select 1 where 2-е условие)
and exists (select 1 where 3-е условие)


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо