SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 09.10.2010 23:50:53

Retrill
Участник
Зарегистрирован: 09.10.2010
Сообщений: 21

"Динамичная" выборка записей

Всем доброго времени суток!

Есть таблица topics с темами для форума. Одно из полей содержит id записи из таблицы visibility_rules, где все поля булева типа (1 означает, что пользователю данной категории тема будет видна, а 0 - не видна). Для наглядности опишу несколько полей.

таблица topics:
id,topic_title,visibility_rule_id;

таблица visibility_rules:
id,student BOOLEAN,teacher BOOLEAN.

таблица users:
id,category.
Здесь в поле category, допустим, будет либо 1 (студент), либо 2 (преподаватель).

Как на любом форуме, нужно показывать темы постранично, например, по 30 штук. Допустим, пользователь обращается к 3-ей странице. Мне нужно определить, какие темы ему показать.

Вся сложность в проверке правил видимости каждой темы для данного пользователя. На 3-ей странице для каждого пользователя буду отображены свои темы. Нужно проверить каждую тему на предмет того, должна она показываться пользователю, или нет.
Есть ли какой-то механизм, позволяющий решить эту задачу относительно просто?

Неактивен

 

#2 10.10.2010 03:46:17

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: "Динамичная" выборка записей

Если пользователь студент, то список тем, видимых ему:
select t.id from topics t join visibility_rules v on t.visibility_rule_id=v.id where student=1

аналогично для преподавателя

Неактивен

 

#3 10.10.2010 21:13:26

Retrill
Участник
Зарегистрирован: 09.10.2010
Сообщений: 21

Re: "Динамичная" выборка записей

vasya написал:

Если пользователь студент, то список тем, видимых ему:
select t.id from topics t join visibility_rules v on t.visibility_rule_id=v.id where student=1

аналогично для преподавателя

Спасибо огромное!

Тогда еще вопрос, задача усложняется.
В дополнение к описанной структуре:
Есть таблица user_invites, где содержится информация о том, какие пользователи приглашены в какую тему.
user_invites:
topic_id,user_id.
Ключ по (topic_id,user_id).

Нужен подобный запрос (учитывающий и предыдущие условия), который бы выбирал только те темы, которые показывать данному пользователю. Если пользователь есть в таблице user_invites для данного topic_id, то нужно показать тему для него в любом случае. Если нет, то вступает в силу предыдущий запрос.

Неактивен

 

#4 11.10.2010 07:15:53

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: "Динамичная" выборка записей

select t.id from (topics t join visibility_rules v on t.visibility_rule_id=v.id) left join user_invites u on t.id=u.topic_id where student=1 or u.user_id='id_вашего_пользователя'

Неактивен

 

#5 11.10.2010 19:08:48

Retrill
Участник
Зарегистрирован: 09.10.2010
Сообщений: 21

Re: "Динамичная" выборка записей

vasya написал:

select t.id from (topics t join visibility_rules v on t.visibility_rule_id=v.id) left join user_invites u on t.id=u.topic_id where student=1 or u.user_id='id_вашего_пользователя'

Феноменально!
Добавил DISTINCT перед t.id и получилось грандиозно! Премного благодарен! smile

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson