Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как лучше сделать выборку? Модераторов 
V
    Опции темы
Gtaman
Дата 30.7.2006, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 10.4.2006

Репутация: нет
Всего: нет



Столкнулся со следующей проблемой:

На форуме нужно определить, являеться ли пользователь модератором на форуме. Модераторы - группы, занесенные в список модераторов. Вот структура таблицы групп:

id | name

таблица членов группы:

group_id | user_id

таблица модераторов:

group_id | forum_id (Эту таблицу я планирую переделать под общую админку.... но смысл остаеться)

так вот, нужно сделать выборку. Я делаю так, но выбираеться только группа, стоящая первая в таблице модераторов.....

Код

$posts_query = mysql_query("SELECT * FROM forum_posts WHERE fid = '$_GET[fid]' AND tid = '$_GET[tid]'");
while($posts = mysql_fetch_array($posts_query)) /* выборка постов */
{
$moders_query = mysql_query("SELECT * FROM moders WHERE forum_id = '$posts[fid]' OR forum_id = 'all'");
$moders = mysql_fetch_array($moders_query);
$moder_ex = mysql_num_rows(mysql_query("SELECT * FROM groups_users WHERE group_id = '$moders[group_id]' AND user_id = '$_SESSION[your_id]'"));
if($moder_ex != 0)
{
// тут значения переменных для модераторов
$warning = "You are moderator!";
}
echo "$posts[message]<br>$warning<br>";
}
 
PM MAIL   Вверх
sayber
Дата 31.7.2006, 01:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 231
Регистрация: 30.7.2006
Где: Moscow - qwerty

Репутация: нет
Всего: нет



Gtaman, А непроще все было в одной таблице сделать и одним запросом проверять? 
--------------------
~~~~~~~~~~~~~~~~~~~~~~~~~~~WoW CafeSayber ©  Портфолио ~~~~~~~~~~~~~~~~~~~~~~~~~~~
PM MAIL WWW ICQ   Вверх
Gtaman
Дата 31.7.2006, 01:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 10.4.2006

Репутация: нет
Всего: нет



sayber, ну уж тогда проще ваще не на пхп писать, а создавать хтмл странички вручную..... типа надо модератору пост скрыть - обращаеться ко мне, а хтмл файл редактирую......

У меня тут не только форум. И группы - не чисто форумное. Чел вообще может не состоять не в какой группе, может состоять в 100 группах....... 
PM MAIL   Вверх
sayber
Дата 31.7.2006, 02:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 231
Регистрация: 30.7.2006
Где: Moscow - qwerty

Репутация: нет
Всего: нет



У меня тоже самое. Разные группы для разных вещей. 
сайт+форум к примеру. 
--------------------
~~~~~~~~~~~~~~~~~~~~~~~~~~~WoW CafeSayber ©  Портфолио ~~~~~~~~~~~~~~~~~~~~~~~~~~~
PM MAIL WWW ICQ   Вверх
Gold Dragon
Дата 31.7.2006, 06:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 2
Всего: 71



Gtaman, что на выходе должно быть? Какие данные? Просто это всё можно сделать одним сложным запросом 


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
GiV
Дата 31.7.2006, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 13.7.2006
Где: rus|53

Репутация: 1
Всего: 9



Код

$posts_query = mysql_query("SELECT * FROM forum_posts WHERE fid = '$_GET[fid]' AND tid = '$_GET[tid]'");
while($posts = mysql_fetch_array($posts_query)) /* выборка постов */
{
$qh= mysql_query("SELECT * FROM groups_users WHERE user_id = '$_SESSION[your_id]'");
$user = mysql_fetch_array($qh);
$moder_ex = mysql_num_rows(mysql_query("SELECT * FROM moders WHERE group_id='$user[group_id]' AND (forum_id = '$posts[fid]' OR forum_id = 'all'")));
if($moder_ex > 0)
{
// тут значения переменных для модераторов
$warning = "You are moderator!";
}
echo "$posts[message]<br>$warning<br>";
}
 
PM MAIL WWW ICQ   Вверх
AntonioBanderaz
Дата 31.7.2006, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Velichko Anton
**


Профиль
Группа: Участник
Сообщений: 851
Регистрация: 28.4.2005
Где: Санкт-Петербург

Репутация: 2
Всего: 18




Цитата(GiV @  31.7.2006,  11:14 Найти цитируемый пост)
"SELECT * FROM forum_posts WHERE fid = '$_GET[fid]' AND tid = '$_GET[tid]'"

В корне не верно.  ты в SQL данные прям из гета кидаешь.... 

а SQL там вроде такой
Код

SELECT 
    tblUsers.`name` as moderName
FROM  `таблица модераторов` tblModers
    INNER JOIN `таблица членов группы` tblGUsers 
                 ON (tblModers.`group_id` = tblGUsers.`group_id`)
    INNER JOIN `таблица юзеров` tblUsers 
                 ON (tblGUsers.`user_id` = tblUsers.`id` AND tblUsers.`id` = 'userOUID')
WHERE 
    tblModers.`forum_id` = forumOUID OR tblModers.`forum_id` = 'ALL'


таблица модераторов связана с таблицей членов группы по group_id, которая в свою очередь связана с таблицей юзеров по (user_id = id)

если рекордсет не пустой то этот чувак есть модер если пустой то не модер. 

А вообще странная у тебя структупа БД. По хорошему надо немного не так. 

Таблица пользователей (М к N на роли и на группы ролей)
Таблица групп (со связкой M к N на таблицу пользователей  и  M к N на роли и группы ролей) 
Таблица групп ролей (со звязками M к N на роли)

Мой совет возьми какой-нидь Enterprise Architect и навояй свою базу. (UML - решает!!!) 


--------------------
ГЫ... 
PM MAIL ICQ   Вверх
GiV
Дата 31.7.2006, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 13.7.2006
Где: rus|53

Репутация: 1
Всего: 9



AntonioBanderaz, а почему мне кажется что два маленьких запроса будут работать быстрее чем один сложный с соединением таблиц?

И так для справки. Никогда не следует указывать в части ON какие бы то ни было условия, накладывающие ограничения на строки в наборе результатов. Если необходимо указать, какие строки должны присутствовать в результате, следует сделать это в выражении WHERE.

Код

    INNER JOIN `таблица юзеров` tblUsers 
                 ON (tblGUsers.`user_id` = tblUsers.`id` AND tblUsers.`id` = 'userOUID')

 
PM MAIL WWW ICQ   Вверх
Gtaman
Дата 31.7.2006, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 10.4.2006

Репутация: нет
Всего: нет



GiV, вроде работает...... Спасибо! smile 
PM MAIL   Вверх
Gtaman
Дата 31.7.2006, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 10.4.2006

Репутация: нет
Всего: нет



GiV, блин, поспешил я радоваться...... работает только, модерирующая группа, в которой состоит чел стоит у него первой в списке групп...... 
PM MAIL   Вверх
GiV
Дата 31.7.2006, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 13.7.2006
Где: rus|53

Репутация: 1
Всего: 9



В таком случае запрос от AntonioBanderaz должен помочь. 
PM MAIL WWW ICQ   Вверх
Gtaman
Дата 31.7.2006, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 10.4.2006

Репутация: нет
Всего: нет



Не помогает...... 
PM MAIL   Вверх
AntonioBanderaz
Дата 1.8.2006, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Velichko Anton
**


Профиль
Группа: Участник
Сообщений: 851
Регистрация: 28.4.2005
Где: Санкт-Петербург

Репутация: 2
Всего: 18



Цитата(GiV @  31.7.2006,  12:10 Найти цитируемый пост)
ON какие бы то ни было условия, накладывающие ограничения на строки в наборе результатов


Обоснуй. Я всегда думал что подключение таблиц идёт после отработки основного запроса, и запросы идёт быстрее.... тоесть в этом случае происходит сначала 
Код

SELECT 
    tblModers.*
FROM  
    `таблица модераторов` tblModers
WHERE 
    tblModers.`forum_id` = forumOUID OR tblModers.`forum_id` = 'ALL'

А потом идёт подключение первой таблицы
  `таблица членов группы` tblGUsers на совпадении условия которое в ON
и тп... Если бы разницы не было, тогда можно было просто всегда в From указывать имена таблиц через зпт. и они бы сначала все сджойнились, а потом уже шла выборка... Что случится если делать все условия в WHERE... )))) Если я не прав объясни )



--------------------
ГЫ... 
PM MAIL ICQ   Вверх
GiV
Дата 1.8.2006, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 13.7.2006
Где: rus|53

Репутация: 1
Всего: 9



Цитата(AntonioBanderaz @  1.8.2006,  11:15 Найти цитируемый пост)
тогда можно было просто всегда в From указывать имена таблиц через зпт. и они бы сначала все сджойнились, а потом уже шла выборка... 

Это уже декартово произведение.


Цитата(AntonioBanderaz @  1.8.2006,  11:15 Найти цитируемый пост)
Я всегда думал что подключение таблиц идёт после отработки основного запроса, и запросы идёт быстрее....

Вот что по тому поводу думает man (раздел по оптимизации):
Код

Выражение "A LEFT JOIN B" в MySQL реализовано следующим образом:

    * Таблица B устанавливается как зависимая от таблицы A и от всех таблиц, от которых зависит A.
    * Таблица A устанавливается как зависимая ото всех таблиц (кроме B), которые используются в условии LEFT JOIN.
    * Все условия LEFT JOIN перемещаются в предложение WHERE.
    * Выполняются все стандартные способы оптимизации соединения, за исключением того, что таблица всегда читается после всех таблиц, от которых она зависит. Если имеется циклическая зависимость, MySQL выдаст ошибку.
    * Выполняются все стандартные способы оптимизации WHERE.
    * Если в таблице A имеется строка, соответствующая выражению WHERE, но в таблице B ни одна строка не удовлетворяет условию LEFT JOIN, генерируется дополнительная строка B, в которой все значения столбцов устанавливаются в NULL.
    * Если LEFT JOIN используется для поиска тех строк, которые отсутствуют в некоторой таблице, и в предложении WHERE выполняется следующая проверка: column_name IS NULL, где column_name - столбец, который объявлен как NOT NULL, MySQL пререстанет искать строки (для отдельной комбинации ключа) после того, как найдет строку, соответствующую условию LEFT JOIN. 


INNER не делает последние два пункта.

http://mysql.com/doc/refman/4.1/en/join.html
Код

 You should generally not have any conditions in the ON part that are used to restrict which rows you want in the result set, but rather specify these conditions in the WHERE clause. There are exceptions to this rule.

PM MAIL WWW ICQ   Вверх
Gtaman
Дата 1.8.2006, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 10.4.2006

Репутация: нет
Всего: нет



AntonioBanderaz, 
GiV, это конечно все интересно, но моя проблема не решена..... ни один запрос не помогает.....
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




[ Время генерации скрипта: 0.0536 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.