Проэктирование БД

findnext

Новичок
1. var_dump(тут результат того что выбрано из базы) :D
2. Выбрать одну всего лишь запись
3. Без цикла не вывести на страницу если записей больше чем 1


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

-~{}~ 06.03.09 01:39:

вывод на страницу или выборку из бд. И то и другое можно и циклами и без циклов делать
 

LONGMAN

Dark Side of the Moon..
Короче, на пример на этом сайте есть добавление какой небудь юзера в список мойх друзей и я тебе добавил. Вот когда я зайду на этом сайте, хочу увидеть сколько мойх друзей сейчась находятся на сайте. Только количество онлайн друзей и ссылка на страницу, где уже будет список онлайн друзей. Вот это хочу сделать у себя. И ищу оптимальный путь, както не хочется использовать mysql запросы в цикле.. Думаю сейчась лучше выразился :) Для друзей есть таблица, структура которого описан в предидущих постах.
 

findnext

Новичок
LONGMAN
ааа..понял ты хочешь одним запросом выбрать, покажи как сейчас у тебя спроектирована бд, интересует структура таблиц в которых у тебя находятся данные относительно юзеров и их друзей
 

LONGMAN

Dark Side of the Moon..
Таблица users:
PHP:
CREATE TABLE `users` (
  `id` int(15) UNSIGNED NOT NULL  auto_increment,
  `user` char(50) BINARY NOT NULL default '',
  `password` char(50) default NULL,
  `level` tinyint(3) UNSIGNED NOT NULL default '0',
  `banned` tinyint(3) UNSIGNED NOT NULL default '0',
  `user_ip` char(20) NOT NULL default '',
  `user_soft` char(200) NOT NULL default '',
  `posts` int(11) UNSIGNED NOT NULL default '0',
  `onl` int(15) UNSIGNED NOT NULL default '0',
  PRIMARY KEY  (`id`),
  UNIQUE KEY  (`user`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 PACK_KEYS=0 AUTO_INCREMENT=100 ;
В onl хранится время time() последной активности юзера.
Таблица friends:
PHP:
CREATE TABLE `friends` (
  `user_id` int(15) UNSIGNED NOT NULL default '0',
  `friend_id` int(15) UNSIGNED NOT NULL default '0',
  PRIMARY KEY  (`user_id`,`friend_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 ;
 

findnext

Новичок
[sql]SELECT * FROM users as a LEFT JOIN friends as b ON a.id=b.friend_id WHERE b.user_id=' ид юзера чьих друзей хочешь выбрать'[/sql]
 

LONGMAN

Dark Side of the Moon..
А что именно это выводит? Мне нужно количество друзей которые онлайн, т.е. чья `onl` > (time() - 300)

-~{}~ 06.03.09 19:58:

Этот запрос верный?
PHP:
SELECT COUNT(*) FROM users as a, friends as b WHERE a.onl > time() - 300 AND a.id = '$id' AND b.user_id = '$id'
 

x-yuri

Новичок
LONGMAN нет, список друзей можно получить так:
[sql]SELECT *
FROM friends f
LEFT JOIN users u ON f.friend_id = u.id
WHERE f.user_id = '...'[/sql]
что ты пытаешься с функцией TIME сделать? Поищи что-нибудь более подходящее
 

LONGMAN

Dark Side of the Moon..
Я хочу список ТОЛЬКО ТЕХ друзей которые в данный момент находятся на сайте. С помошью time() я определяю юзер онлайн или оффлайн, т.е. если `onl` > (time() - 300) значит юзер онлайн, иначе - оффлайн.
 

pilot911

Новичок
по-моему, проще сделать так

SELECT COUNT(*) FROM users WHERE last_visit > ".time()." - 300 AND id IN ( ".$user['friend']." )

где $user['friend'] - поле в таблице пользователей с друзьями через запятую
 

x-yuri

Новичок
С помошью time() я определяю юзер онлайн или оффлайн, т.е. если `onl` > (time() - 300) значит юзер онлайн, иначе - оффлайн
ты свой запрос запустить пробовал? И по ссылке сходи ;-) или используй php-функцию, как pilot911
p.s. твой onl это фактически last_visit

pilot911
во-первых, некоторые люди могут столкнуться с проблемой слишком большого количества друзей (для CHAR(255)), во-вторых, имхо это преждевременная оптимизация
 

LONGMAN

Dark Side of the Moon..
pilot911, у меня так и было но переделал т.к. это не оптимально.
x-yuri, на счёт ссылки, я не силён в английском, можешь по русский сказать что там такого :)
 

x-yuri

Новичок
LONGMAN ты не читай, ты пример посмотри
еще либо посмотри на NOW или используй php-аналог
 

LONGMAN

Dark Side of the Moon..
Ура! Вроде сделал :) Методом тыка дошёл до этого:
PHP:
$tm = time() - 300;

$onlfriends = $db->query("SELECT COUNT(*) FROM `friends` as a, `users` as b WHERE a.user_id = '".$id."' AND b.id = a.friend_id AND b.onl > '".$tm."'");
Работает :) Вот этого я хотел
 

x-yuri

Новичок
надеюсь ты не просто подогнал запрос под результат, а понимаешь почему твои предыдущие варианты не работали и почему этот работает
 

LONGMAN

Dark Side of the Moon..
x-yuri, по этому полюбил этот форум что тут заставляют думать :) Спасибо вам :)

-~{}~ 08.03.09 00:00:

Есть такой вопрос, имеется чат и форум. Таблица users для обойх одна. Как лучше разделить пермишены? Как вы делаете

-~{}~ 08.03.09 02:16:

Ну типа один юзер в чате модер, другой на форуме, третий модер только одного раздела и т.д.
 

LONGMAN

Dark Side of the Moon..
Можешь объяснить на примерах? Или подскажи где прочитать об этом
 

findnext

Новичок
создаёшь разные группы, присваиваешь группе права, присваиваешь группу юзеру. Вроде понятно
 

tashkentchi

Новичок
Таблица групп
Таблица ролей
Связка групп и ролей
Таблица юзеров с полем ид_группы

+ Класс для управления доступом на основе ролей.
 

LONGMAN

Dark Side of the Moon..
Автор оригинала: tashkentchi
Таблица групп
Таблица ролей
Связка групп и ролей
Таблица юзеров с полем ид_группы

+ Класс для управления доступом на основе ролей.
Можно где небудь достать для примера дамп этих таблиц + класс для управления? Что бы попрактиковался что и как лучше сделать
 
Сверху