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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> В запросе к нескольким таблицам добавить count() 
:(
    Опции темы
vitaxaprog111
Дата 11.11.2011, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Какое то название темы получилось...
Делаю форум. Из нескольких таблиц выбираю данные для вывода поста. 
Есть четыре таблицы
Код

CREATE TABLE IF NOT EXISTS `users` (
  `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
  `group_id` mediumint(8) unsigned NOT NULL,
  `ip_address` char(16) NOT NULL,
  `username` varchar(15) NOT NULL,
  `password` varchar(40) NOT NULL,
  `salt` varchar(40) DEFAULT NULL,
  `email` varchar(100) NOT NULL,
  `activation_code` varchar(40) DEFAULT NULL,
  `forgotten_password_code` varchar(40) DEFAULT NULL,
  `remember_code` varchar(40) DEFAULT NULL,
  `created_on` int(11) unsigned NOT NULL,
  `last_login` int(11) unsigned DEFAULT NULL,
  `active` tinyint(1) unsigned DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=24 ;

CREATE TABLE IF NOT EXISTS `profile` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL COMMENT 'идентификатор пользователя',
  `age` int(3) DEFAULT NULL COMMENT 'Возраст пользователя',
  `country` varchar(254) DEFAULT NULL COMMENT 'страна проживания',
  `city` varchar(254) DEFAULT NULL COMMENT 'город проживания',
  `avatar` varchar(254) DEFAULT NULL COMMENT 'фото или аватар',
  `activtask` tinyint(1) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COMMENT='Профиль пользователя' AUTO_INCREMENT=21 ;

CREATE TABLE IF NOT EXISTS `groups` (
  `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL,
  `description` varchar(100) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;

CREATE TABLE IF NOT EXISTS `messages` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `date` datetime DEFAULT NULL,
  `user_id` int(11) DEFAULT NULL,
  `topic_id` int(11) DEFAULT NULL,
  `subject` varchar(254) DEFAULT NULL,
  `body` text,
  PRIMARY KEY (`id`),
  KEY `topic_id` (`topic_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=21 ;

Вот запрос 
Код

SELECT m.*,p.user_id,p.avatar,u.group_id,g.description
FROM `messages` as m
LEFT JOIN `profile` as p on p.user_id=m.user_id 
and m.id is not NULL
LEFT JOIN `users` as u on u.id=m.user_id
LEFT JOIN `groups` as g on g.id=u.group_id
WHERE m.topic_id = 4 ORDER BY m.date

Мне нужно еще как то подсчитать количество постов у каждого пользователя.
Не могу придумать как составить запрос что бы считать количество постов пользователей, которые попадают в результат выборки.
count() уже и так и так прикручивал, все время выдает ошибку.
Подскжите как можно сделать?

P.S. Или может плюнуть на составление сложного запроса и добавить поле количество постов в профиль пользователя и при добавлении поста увеличивать это значение?

Это сообщение отредактировал(а) vitaxaprog111 - 11.11.2011, 16:46
PM MAIL ICQ   Вверх
$дмитрий
Дата 11.11.2011, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1037
Регистрация: 19.6.2004

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



Цитата

P.S. Или может плюнуть на составление сложного запроса и добавить поле количество постов в профиль пользователя и при добавлении поста увеличивать это значение?

Именно так и никак иначе smile 
PM MAIL   Вверх
vitaxaprog111
Дата 11.11.2011, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Спасибо. Думал запросом проще будет. Оказалось нет. 
PM MAIL ICQ   Вверх
$дмитрий
Дата 11.11.2011, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1037
Регистрация: 19.6.2004

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



Тут не в простоте дело, а в правильном подходе. Представь, на этом форуме посещаемостью в 20 000 уникумов в день, и для каждый раз мы будем генерировать такой запрос:
Код

SELECT m.*,p.user_id,p.avatar,u.group_id,g.description
FROM `messages` as m
LEFT JOIN `profile` as p on p.user_id=m.user_id 
and m.id is not NULL
LEFT JOIN `users` as u on u.id=m.user_id
LEFT JOIN `groups` as g on g.id=u.group_id
WHERE m.topic_id = 4 ORDER BY m.date

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

Это сообщение отредактировал(а) $дмитрий - 11.11.2011, 17:24
PM MAIL   Вверх
vitaxaprog111
Дата 11.11.2011, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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


 




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


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

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