SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 01.03.2010 09:56:57

fuze
Участник
Зарегистрирован: 25.01.2010
Сообщений: 17

count возвращает неправильное количество

Собственно есть запрос:


SELECT u.id, b. * , u.id AS uid, u.nickname AS author, u.login as author_login,
                       COUNT(p.user_id) as records,
                       IFNULL( SUM( r.points ) , 0 ) AS points
                FROM zbl_users u, zbl_blogs b
                LEFT JOIN zbl_blog_posts p ON p.blog_id = b.id
                LEFT JOIN zbl_ratings r ON r.item_id = p.id AND r.target = 'blogpost'
                WHERE b.user_id = u.id AND owner='user'GROUP BY b.id
                 ORDER BY points DESC
 


В таблице zbl_blog_posts к примеру по user_id = 28 есть 3 записи, вышеописанный запрос возвращает 7, по user_id = 63 есть 1 запись возвращает 4.
Т.е. я хочу, чтобы запрос возвращал в records количество записей пользователя в блоге.
Помогите разобраться.

SHOW CREATE TABLE zbl_users;
| zbl_users | CREATE TABLE `zbl_users` (
  `id` int(11) NOT NULL auto_increment,
  `group_id` int(11) NOT NULL default '1',
  `login` varchar(100) NOT NULL,
  `nickname` varchar(100) NOT NULL,
  `password` varchar(100) NOT NULL,
  `email` varchar(100) NOT NULL,
  `icq` varchar(15) NOT NULL,
  `regdate` datetime NOT NULL default '0000-00-00 00:00:00',
  `logdate` datetime NOT NULL default '0000-00-00 00:00:00',
  `birthdate` date NOT NULL default '0000-00-00',
  `is_locked` int(11) NOT NULL,
  `is_deleted` int(11) NOT NULL,
  `rating` int(11) NOT NULL,
  `points` int(11) NOT NULL,
  `last_ip` varchar(15) NOT NULL,
  `status` varchar(255) NOT NULL default '? ???????!',
  `status_date` datetime NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `login` (`login`),
  KEY `is_locked` (`is_locked`,`is_deleted`,`icq`)
) ENGINE=InnoDB AUTO_INCREMENT=72 DEFAULT CHARSET=cp1251 |
 



 SHOW CREATE TABLE zbl_blogs;
| zbl_blogs | CREATE TABLE `zbl_blogs` (
  `id` int(11) NOT NULL auto_increment,
  `user_id` int(11) NOT NULL,
  `title` varchar(250) NOT NULL,
  `pubdate` datetime NOT NULL,
  `allow_who` varchar(15) NOT NULL,
  `view_type` varchar(15) NOT NULL default 'list',
  `showcats` int(11) NOT NULL default '1',
  `ownertype` varchar(15) NOT NULL default 'single',
  `premod` int(11) NOT NULL,
  `forall` int(11) NOT NULL default '1',
  `owner` varchar(10) NOT NULL default 'user',
  `seolink` varchar(255) NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `seolink` (`seolink`),
  KEY `user_id` (`user_id`),
  KEY `allow_who` (`allow_who`),
  KEY `blog1` (`ownertype`,`owner`)
) ENGINE=InnoDB AUTO_INCREMENT=50 DEFAULT CHARSET=cp1251 |
 



SHOW CREATE TABLE zbl_blog_posts;
| zbl_blog_posts | CREATE TABLE `zbl_blog_posts` (
  `id` int(11) NOT NULL auto_increment,
  `user_id` int(11) NOT NULL,
  `cat_id` int(11) NOT NULL,
  `blog_id` int(11) NOT NULL,
  `pubdate` datetime NOT NULL,
  `title` varchar(250) NOT NULL,
  `feel` varchar(100) NOT NULL,
  `music` varchar(100) NOT NULL,
  `content` text NOT NULL,
  `allow_who` varchar(20) NOT NULL,
  `edit_times` int(11) NOT NULL,
  `edit_date` datetime NOT NULL,
  `published` int(11) NOT NULL default '1',
  `seolink` varchar(255) NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `seolink` (`seolink`),
  KEY `user_id` (`user_id`),
  KEY `pubdate` (`published`,`pubdate`),
  KEY `pubdate_2` (`pubdate`,`blog_id`)
) ENGINE=InnoDB AUTO_INCREMENT=60 DEFAULT CHARSET=cp1251 |

 


в zbl_ratings хранятся оценки для постов, т.е. points = [-1, 1]
и привязываются они к постам через item_id и target='blogpost'

Отредактированно fuze (01.03.2010 10:35:46)

Неактивен

 

#2 01.03.2010 13:17:45

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: count возвращает неправильное количество

Не могу себе представить, как из 3 получается 7. Может, 6? smile

Вы выбираете данные не из одной таблицы, а из трех. Общее количество
строк в таких таблицах — произведение количеств строк отдельных таблиц.
Соответственно, и COUNT() насчитывает больше. Но семь никак получиться
из трех не может (должно быть кратно). Может, просто данные поменялись?

Неактивен

 

#3 01.03.2010 13:37:29

fuze
Участник
Зарегистрирован: 25.01.2010
Сообщений: 17

Re: count возвращает неправильное количество

paulus, проверил еще раз. по юзерайди 28 - 3 записи, запрос отдает 7. Ошибки быть не может.

Что Вы имели в виду говоря что данные поменялись?

И резонный вопрос - как быть с этим, посоветуйте пожалуйста.

Неактивен

 

#4 01.03.2010 13:46:21

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: count возвращает неправильное количество

Делать — считать количества отдельно. Обычно отдельным запросом с
группировкой это делают. Возможно, спасет COUNT (DISTINCT fieldname) —
в зависимости от того, какие поля меняются. Но сильно усложнит запрос.

Неактивен

 

#5 01.03.2010 13:56:56

fuze
Участник
Зарегистрирован: 25.01.2010
Сообщений: 17

Re: count возвращает неправильное количество

paulus написал:

Делать — считать количества отдельно. Обычно отдельным запросом с
группировкой это делают. Возможно, спасет COUNT (DISTINCT fieldname) —
в зависимости от того, какие поля меняются. Но сильно усложнит запрос.

COUNT( DISTINCT p.id ) действительно помог.

Теперь с индексами надо покумекать... Или все же выводить в отдельный запрос.

Спасибо за ответ.

Неактивен

 

Board footer

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