Форум: "Базы";
Текущий архив: 2004.01.20;
Скачать: [xml.tar.bz2];
Внизкак организовать 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;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.011 c