![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
как организовать SQL запрос [MSSQL, MySQL]
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-е условие)