Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.01.20;
Скачать: CL | DM;

Вниз

как организовать SQL запрос   Найти похожие ветки 

 
Undert ©   (2003-12-22 12:33) [0]

Помогите примером в следующем:
Существует некая система, где:
Есть огромная таблица, называемая 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 ?


 
paul_k ©   (2003-12-22 12:48) [1]

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


 
Johnmen ©   (2003-12-22 12:49) [2]

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

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


 
Undert ©   (2003-12-22 12:55) [3]


> Johnmen ©


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


 
Johnmen ©   (2003-12-22 13:22) [4]

>Undert ©

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


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


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

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

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


 
paul_k ©   (2003-12-22 13:34) [6]

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

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


 
JibSkeart ©   (2003-12-22 13:38) [7]

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

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:38) [8]

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:40) [9]

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


 
paul_k ©   (2003-12-22 13:42) [10]

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


 
JibSkeart ©   (2003-12-22 13:46) [11]

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


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

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


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


> JibSkeart ©
> paul_k ©


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

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


 
Undert ©   (2003-12-22 13:56) [14]

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


 
JibSkeart ©   (2003-12-22 13:57) [15]

ну тогда показывай все что только для него :)


 
paul_k ©   (2003-12-22 13:58) [16]

2 Undert
а теперь формализуй эти требования, ну хотя-бы в виде
"если то иначе" должно помочь


 
Undert ©   (2003-12-22 14:14) [17]


> paul_k ©


Вот уж какую неделю формализовываю - не выходит =(

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

Вот так я себе расал - не помогло :(( Или уже последие мозги отшибло ...


 
paul_k ©   (2003-12-22 14:23) [18]

то есть продолжаем формализовывать.
нужны все страницы (записи таблицы т1) для которых есть запись в таблице Т2 и ключом (id) пользователя верно?
преобразуем данную фразу в код
select * from t_1
where exists(select 1 from t_2 where t_2.t_1Id = t_1.id and t_2.usId = @user_id)


таким образом получили все записи t_1 для которых есть соответствующая записть в t_2

осталось согласно правилам формирования "дерева" разобрать эти данные


 
JibSkeart ©   (2003-12-22 14:27) [19]

Вот уже понятней :)))


 
Undert ©   (2003-12-22 14:38) [20]


> paul_k ©

Только наоборот, нужны все записи из таблицы1, которые не присутствуют в таблице2, вот здесь на слово not ругается SQL ...


 
JibSkeart ©   (2003-12-22 14:43) [21]

возьми все в скобки то есть (not exists ... ) and (not exists)


 
paul_k ©   (2003-12-22 14:46) [22]

1. какой версия? MsSql или все-таки MySql
2. Зачем не присутствуют? в Т2 вроде как права доступа то есть присутствовать должны. но не суть
exists возвращает true или false в зависимости от того вернул select данные или нет. (о как загнул) проверь такую запись
select * from t1 where not (1=2)
должно вернуть все из t1


 
paul_k ©   (2003-12-22 14:47) [23]

да .. правильно расставленые скобки действительно лечат


 
Undert ©   (2003-12-22 15:55) [24]

You have an error in your SQL syntax near "exists(select * from usr29,events where usr29.eid = events.id)" at line 1

вместо exists делаю exist - тоже самое, только
You have an error in your SQL syntax near "(select * from usr29,events where usr29.eid = events.id)" at line 1


 
paul_k ©   (2003-12-22 15:58) [25]

MsSql или MySql?
правильный синтаксис exists()
использовал в Access,MSSql,Sybase ASE
есть ли такая функция в MySql это вопрос к документации по MySql


 
Undert ©   (2003-12-22 16:01) [26]

MSSql


 
Undert ©   (2003-12-22 16:02) [27]

$query = ("select * from events where not exists(select * from usr$userid,events where usr$userid.eid = events.id)");


 
JibSkeart ©   (2003-12-22 16:03) [28]

тогда есть

exists (селект )


 
JibSkeart ©   (2003-12-22 16:05) [29]

а покажи весь свой запрос в каком виде ты его написал ?


 
JibSkeart ©   (2003-12-22 16:06) [30]

select * from events where not exists(select * from usr$userid,,. events where usr$userid.eid = events.id)");

а это то зачем ?


 
paul_k ©   (2003-12-22 16:17) [31]

да... а еще непонятно что такое usr$userid а точнее зачем там $


 
Undert ©   (2003-12-22 16:21) [32]


> paul_k ©


Ну типа это $userid - заменяется на циферку :) PHP ето :)

> JibSkeart ©

А что с ним, что без него - тоже самое выдаёт ...


 
JibSkeart ©   (2003-12-22 16:22) [33]

нет что то не так ...


 
paul_k ©   (2003-12-22 16:24) [34]

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



Страницы: 1 вся ветка

Текущий архив: 2004.01.20;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.034 c
1-63232
serg128
2004-01-09 12:49
2004.01.20
Как спрятать процесс в Win98?


1-63066
Petrovich
2004-01-08 16:08
2004.01.20
Как вставить пустую строку в INI-файл?


7-63420
MAXHO
2003-10-25 14:49
2004.01.20
LPT-порт


3-62987
3APA3A
2003-12-24 00:53
2004.01.20
Размер Paradox овской БД


7-63429
Ivolg
2003-11-03 15:22
2004.01.20
Контекстное меню