Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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
14-25855
Алексей
2004-02-17 14:01
2004.03.09
Как сделать так


14-25935
xMan
2004-02-13 15:48
2004.03.09
Установка SP1 На WinXP Home


4-25972
MScorp
2004-01-03 00:20
2004.03.09
Принять WinPopup сообщение


3-25709
TATIANA
2004-02-10 15:26
2004.03.09
Как сделать из формы шаблон для дальнейшего использования


1-25822
Berezne
2004-02-25 16:56
2004.03.09
Вопрос по DLL





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский