Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.03.09;
Скачать: CL | DM;

Вниз

Как лучше сделать запрос?   Найти похожие ветки 

 
SergP ©   (2004-02-13 04:23) [0]

Есть форумы типа phpBB, vBulletin или т.п. (впрочем это не важно какой именно он, просто такого типа, т.е. не похожие на этот).

написал я offline клиент к одному такому форуму.

Смысл в том, что там используется разный доступ юзеров к разным форумам (имеется ввиду разделам). При этом достум может задаваться как отдельно для юзеров, так и целым группам.
У хостера стоит MySQL 4.00.15 (Скрипт для загрузки пиcал на PHP)
Сначала проверяю пароль юзера и нахожу его id.
Зате использую запрос: (Полный запрос не привожу, но его смысл в связи следующих таблиц:)

useraccess->forum->thread->posts
usergroup->groupaccess->forum->thread->posts

Кроме этого для таблиц useraccess и groupaccess в запрос включается проверка разрешения чтения соотв. форума(раздела) (can_view=1), и доп. условия (выборка сообщений по диапазону даты создания).

Вобщем написал эти 2 подзапроса и объединил их используя UNION
Все работает как нужно.

Теперь захотел подключить к клиенту другой форум, где у хостера стоит MySQL 3.23.XX , т.е. UNION там не катит.

Как мне можно переписать мой запрос для последнего случая, если нельзя использовать UNION? (Временные таблицы создавать мне что-то не хочется).


 
Style ©   (2004-02-15 20:40) [1]

>>Как лучше сделать запрос?
>>(Полный запрос не привожу, но его смысл в связи следующих таблиц:)


Как тебе можно помочь если нет самого запроса!


 
SergP ©   (2004-02-15 20:47) [2]

Вот этот кусок с запросом для версии 4,00,15: (в переменной $userid уже находится id юзера, вычисляемый ранее, а в $time - время с которого запрошено обновление сообщений:

...
// выборка информации о постах
// id поста, id постера, id топика,id форума,время поста, сабж, текст поста

// Информация разрешенная для просмотра отдельным юзерам
$user_access_query = "select a.post_id,a.uid,a.topic_id,a.forum_id,post_time,a.subject,a.post_text
from e_xoops_bbplus_posts as a,e_xoops_bbplus_forum_access as b
where a.forum_id=b.forum_id and user_id = $userid and b.can_view=1 and a.post_time>=$time";

// Информация разрешенная для просмотра группам юзеров
$group_access_query = "select a.post_id,a.uid,a.topic_id,a.forum_id,post_time,a.subject,a.post_text
from e_xoops_bbplus_posts as a,e_xoops_bbplus_forum_group_access as b,e_xoops_groups_users_link as c
where a.forum_id=b.forum_id and b.group_id=c.groupid and c.uid = $userid and b.can_view=1 and a.post_time>=$time";

//Объдинение результатов запросов по юзерам и группам
$union_access = "($user_access_query) UNION ($group_access_query) order by post_id";

$result_posts=mysql(DBName,$union_access);
...


 
SergP ©   (2004-02-15 20:52) [3]

Это скрипт для выгрузки из старого форума, которого уже не существует из-за того что хостер обанкротился. Новый форум phpBB, с ним в принципе то же самое, только в табличе с сообщениями нет поля forum_id, поэтому придется подключить в запрос еще одну таблицу с топиками. Но мне главное знать принцип как обойтись без UNION...


 
Style ©   (2004-02-15 21:24) [4]

Попробуй так:


SELECT
a.post_id,a.uid,a.topic_id,a.forum_id,post_time,a.subject,a.post_text
FROM
e_xoops_bbplus_posts as a,
e_xoops_bbplus_forum_group_access as b,
e_xoops_groups_users_link as c
e_xoops_bbplus_forum_access as d
WHERE
(
a.forum_id=b.forum_id and
b.group_id=c.groupid and
c.uid = $userid and
b.can_view=1 and
a.post_time>=$time
) or
(
a.forum_id=d.forum_id and
user_id = $userid and
d.can_view=1 and
a.post_time>=$time
)


 
SergP ©   (2004-02-15 21:33) [5]

Ага. Понял. Только ИМХО в таком случае будут вылезать дублированые записи... если к одному и тому-же есть доступ как индивидуальный так и групповой...
Поэтому небольшой вопрос: Как правильно применить DICTINCT к полю post_id? Т.е. как это правильно записывается? А то как-то мне не приходилось никогда его юзать...


 
Style ©   (2004-02-15 21:42) [6]

Даже не знаю, тоже не юзал, посмотри где нить на MySQL.com
а вообще можно попробовать сделать group by для post_id
только каждое поле после SELECT нужно написать как
max(a.post_id),
max(a.uid),
max(a.topic_id),
ну и т.д...
т.е. будет выбрано максимальное значение, а нам это без разницы т.к. post_id уникально.


 
Style ©   (2004-02-15 21:44) [7]

Что-то вроде того:

SELECT
max(a.post_id),max(a.uid),max(a.topic_id),max(a.forum_id),max(post_time),max(a.subject),max(a.post_text)
FROM
e_xoops_bbplus_posts as a,
e_xoops_bbplus_forum_group_access as b,
e_xoops_groups_users_link as c
e_xoops_bbplus_forum_access as d
WHERE
(
a.forum_id=b.forum_id and
b.group_id=c.groupid and
c.uid = $userid and
b.can_view=1 and
a.post_time>=$time
) or
(
a.forum_id=d.forum_id and
user_id = $userid and
d.can_view=1 and
a.post_time>=$time
) group by a.post_id



Страницы: 1 вся ветка

Текущий архив: 2004.03.09;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.019 c
3-25683
gedd
2004-02-09 07:22
2004.03.09
ehlib


1-25804
NPR2
2004-02-25 13:28
2004.03.09
запуск процедуры в определенное время


3-25699
Karlson
2004-02-10 19:30
2004.03.09
Обязательное поле, которое стало необязательным :)


1-25744
uUnknown
2004-02-26 19:21
2004.03.09
Чем может быть чреват следующий код?


1-25765
Брат
2004-02-26 15:18
2004.03.09
Немного математики