![]() |
| ||
|
|
Новости |
Поиск |
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 ?
paul_k (2003-12-22 16:24:00) [1]
а отладь-ка ты этот селект в кверианалайзере, например.
а потом уже подстановки делай. помогает иногда
JibSkeart (2003-12-22 16:22:00) [2]
нет что то не так ...
Undert (2003-12-22 16:21:00) [3]
> paul_k ©
Ну типа это $userid - заменяется на циферку :) PHP ето :)
> JibSkeart ©
А что с ним, что без него - тоже самое выдаёт ...
paul_k (2003-12-22 16:17:00) [4]
да... а еще непонятно что такое usr$useridа точнее зачем там $
JibSkeart (2003-12-22 16:06:00) [5]
select * from events where not exists(select * from usr$userid,,. eventswhere usr$userid.eid = events.id)");
а это то зачем ?
JibSkeart (2003-12-22 16:05:00) [6]
а покажи весь свой запрос в каком виде ты его написал ?
JibSkeart (2003-12-22 16:03:00) [7]
тогда есть
exists (селект )
Undert (2003-12-22 16:02:00) [8]
$query = ("select * from events where not exists(select * from usr$userid,events where usr$userid.eid = events.id)");
Undert (2003-12-22 16:01:00) [9]
MSSql
paul_k (2003-12-22 15:58:00) [10]
MsSql или MySql?
правильный синтаксис exists()
использовал в Access,MSSql,Sybase ASE
есть ли такая функция в MySql это вопрос к документации по MySql
Undert (2003-12-22 15:55:00) [11]
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 14:47:00) [12]
да .. правильно расставленые скобки действительно лечат
paul_k (2003-12-22 14:46:00) [13]
1. какой версия? MsSql или все-таки MySql
2. Зачем не присутствуют? в Т2 вроде как права доступа то есть присутствовать должны. но не суть
exists возвращает true или false в зависимости от того вернул select данные или нет. (о как загнул) проверь такую запись
select * from t1 where not (1=2)
должно вернуть все из t1
JibSkeart (2003-12-22 14:43:00) [14]
возьми все в скобки то есть (not exists ... ) and (not exists)
Undert (2003-12-22 14:38:00) [15]
> paul_k ©
Только наоборот, нужны все записи из таблицы1, которые не присутствуют в таблице2, вот здесь на слово not ругается SQL ...
JibSkeart (2003-12-22 14:27:00) [16]
Вот уже понятней :)))
paul_k (2003-12-22 14:23:00) [17]
то есть продолжаем формализовывать.
нужны все страницы (записи таблицы т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
осталось согласно правилам формирования "дерева" разобрать эти данные
Undert (2003-12-22 14:14:00) [18]
> paul_k ©
Вот уж какую неделю формализовываю - не выходит =(
У меня идёт сейчас просто перебор (посему из-за 1568 событий - тормозит) - если пользователь имеет доступ к данному событию (смотрю по тому к какой странице принадлежит оно) иду дальше, иначе перехожу к следующему, если пользователь написал его сам, то перехожу к следующему, иначе смотрю, если оно не присутствует в его личной таблице, то выдаю сообщение что появилось новое сообщение.
Вот так я себе расал - не помогло :(( Или уже последие мозги отшибло ...
paul_k (2003-12-22 13:58:00) [19]
2 Undert
а теперь формализуй эти требования, ну хотя-бы в виде
"если то иначе" должно помочь
JibSkeart (2003-12-22 13:57:00) [20]
ну тогда показывай все что только для него :)