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

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


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

-~{}~ 06.03.09 01:39:

вывод на страницу или выборку из бд. И то и другое можно и циклами и без циклов делать
 
Короче, на пример на этом сайте есть добавление какой небудь юзера в список мойх друзей и я тебе добавил. Вот когда я зайду на этом сайте, хочу увидеть сколько мойх друзей сейчась находятся на сайте. Только количество онлайн друзей и ссылка на страницу, где уже будет список онлайн друзей. Вот это хочу сделать у себя. И ищу оптимальный путь, както не хочется использовать mysql запросы в цикле.. Думаю сейчась лучше выразился :-) Для друзей есть таблица, структура которого описан в предидущих постах.
 
LONGMAN
ааа..понял ты хочешь одним запросом выбрать, покажи как сейчас у тебя спроектирована бд, интересует структура таблиц в которых у тебя находятся данные относительно юзеров и их друзей
 
Таблица 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 ;
 
[sql]SELECT * FROM users as a LEFT JOIN friends as b ON a.id=b.friend_id WHERE b.user_id=' ид юзера чьих друзей хочешь выбрать'[/sql]
 
А что именно это выводит? Мне нужно количество друзей которые онлайн, т.е. чья `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'
 
LONGMAN нет, список друзей можно получить так:
[sql]SELECT *
FROM friends f
LEFT JOIN users u ON f.friend_id = u.id
WHERE f.user_id = '...'[/sql]
что ты пытаешься с функцией TIME сделать? Поищи что-нибудь более подходящее
 
Я хочу список ТОЛЬКО ТЕХ друзей которые в данный момент находятся на сайте. С помошью time() я определяю юзер онлайн или оффлайн, т.е. если `onl` > (time() - 300) значит юзер онлайн, иначе - оффлайн.
 
по-моему, проще сделать так

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

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

pilot911
во-первых, некоторые люди могут столкнуться с проблемой слишком большого количества друзей (для CHAR(255)), во-вторых, имхо это преждевременная оптимизация
 
pilot911, у меня так и было но переделал т.к. это не оптимально.
x-yuri, на счёт ссылки, я не силён в английском, можешь по русский сказать что там такого :-)
 
LONGMAN ты не читай, ты пример посмотри
еще либо посмотри на NOW или используй php-аналог
 
Ура! Вроде сделал :-) Методом тыка дошёл до этого:
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, по этому полюбил этот форум что тут заставляют думать :-) Спасибо вам :-)

-~{}~ 08.03.09 00:00:

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

-~{}~ 08.03.09 02:16:

Ну типа один юзер в чате модер, другой на форуме, третий модер только одного раздела и т.д.
 
Можешь объяснить на примерах? Или подскажи где прочитать об этом
 
создаёшь разные группы, присваиваешь группе права, присваиваешь группу юзеру. Вроде понятно
 
Таблица групп
Таблица ролей
Связка групп и ролей
Таблица юзеров с полем ид_группы

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

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