Форум: "Потрепаться";
Текущий архив: 2004.03.09;
Скачать: [xml.tar.bz2];
ВнизКак лучше сделать запрос? Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.007 c