Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
1-63197
SwaT
2004-01-10 01:30
2004.01.20
Помогите разобраться с формами...


1-63142
Mihey
2004-01-06 21:41
2004.01.20
Сложный перенос слов


1-63252
Maxkat
2004-01-08 19:53
2004.01.20
WinExec, проблема с ненужным копированием файлов


3-62974
MixerPro
2003-12-19 11:54
2004.01.20
Залипание после запросов.


14-63345
MBo
2003-12-27 09:36
2004.01.20
Субботние задачки





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский