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 ?


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]

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


Страницы:   1 2

Наверх

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