|
MySQL.RU - Webboard
Вернуться
Оптимизация запроса (Dee) 14/07/2009 - 17:30:39
Re: Оптимизация запроса (Peacecoder) 14/07/2009 - 18:49:46
Re: Оптимизация запроса (Dee) 15/07/2009 - 08:57:28
> Original message text:
> From: Dee - 14/07/2009 - 17:30:39
> Subject:Оптимизация запроса
> -----------------
> Здравствуйте.
>
> Задача такая, нужно сделать выборку всех статей из базы доступ к которым пользователь имеет.
> Статьи так же разбиты на группы.
>
> Я делала так: в начале отбирал все статьи доступные пользователю, потом в втором запросе подставлял условия выборки по группам стати и проверка вхождения в массив доступных статей( пример: select a.id from articles as a where a.group>0 and a.id IN (0, 1, 2 ,3) )
>
> хотел бы узнать как будет лучше, правильнее и быстрее
> x - уровень доступа
> y - треб группа
>
> Способ №1
> SELECT a.id FROM article as a WHERE a.access = X
> SELECT a.id FROM article as a WHERE a.group = Y AND a.id IN (Спсиок ID из первого запроса)
>
> Способ №2
> SELECT a.id
> FROM article as a, (SELECT a.id FROM article as a WHERE a.access = X) as b
> WHERE a.group = Y AND a.id=b.id
>
>
>
>
>
From: Dee - 15/07/2009 - 08:57:28
Subject:Оптимизация запроса
-----------------
SELECT c.*, g.*, u.*
FROM contents as c, groups as g, users as u
(
SELECT c.id
FROM contents as c, groups as g, users as u, connections as con,
(
SELECT g.id
FROM connections as con, groups as g
WHERE con.id='64' AND con.idf=g.id AND con.both='1' AND con.type='0'
) ag
WHERE (c.author='64' OR '18'='25') OR (c.state='1' AND (
(c.private='1') OR
(c.private='2' AND c.author=con.id AND con.idf=ag.id AND con.both='1' AND con.type='3') OR
(c.private='3' AND NOT (c.author=con.id AND con.idf=ag.id AND con.both='1' AND con.type='3') )
) )
) as ac,
(
SELECT g.id
FROM groups as g, users as u, connections as con
WHERE ( (con.id='64' AND con.idf=g.id AND con.both='1' AND con.type='0') OR '18'='25') OR
(g.private='1') OR
(g.private='2' AND con.idf=g.id AND con.id='64' AND con.both='1' AND con.type IN (1,2,3) ) OR
(g.private='3' AND NOT (con.idf=g.id AND con.id='64' AND con.both='1' AND con.type IN (1,2,3) ) )
) as aic
WHERE c.id=ac.id AND c.author=u.id AND c.id_group=g.id AND g.id=aic.id
GROUP BY c.id
ORDER BY c.date desc
LIMIT 0 , 20
contents (id, date, id_group, author, title, text, state, private)
groups (id, title, description, private)
users (id, username)
connections (id, idf , both, type)
groups - это общие группы и личные группы
type=0 (Создатель)
type=1 (Модератор)
type=2 (Участник)
type=3 (Друг)
private=1 (доступ всем)
private=2 (доступ только участникам или друзьям)
private=3 (доступ всем кроме участников и друзей)
[Это сообщение - спам!]
Последние сообщения из форума
Уважаемые посетители форума MySQL.RU!
Убедительная просьба, прежде чем задавать свой вопрос в этом форуме, обратите внимание на разделы:
- ответы на наиболее часто задаваемые вопросы - FAQ
- раздел документация
- раздел поиск по сообщениям форума и документации
Также, старайтесь наиболее подробно указывать свою ситуацию (версию операционной системы, версию MySQL,
версию программного обеспечения, по которому возникает вопрос, текст возникающих ошибок, и др.)
Помните, чем конкретнее Вы опишете ситуацию, тем больше шансов получить реальную помощь.
35885
|
|