powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / 3 таблицы, count'ы, join'ы и т.п.
7 сообщений из 7, страница 1 из 1
3 таблицы, count'ы, join'ы и т.п.
    #32737044
132
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет всем!

У меня возникла проблема.

Есть три таблицы

пользователи (users). коментарии пользователей(comments) и статьи пользователей (articles)

Вот их дамп
Код:

CREATE TABLE `articles` (
`article_id` int(6) unsigned NOT NULL auto_increment,
`user_id` int(6) unsigned NOT NULL default '0',
`article` varchar(255) NOT NULL default '',
PRIMARY KEY (`article_id`),
KEY `user_id` (`user_id`)
) TYPE=MyISAM AUTO_INCREMENT=3 ;

INSERT INTO `articles` VALUES (1, 1, 'Статья Васи пупкина');
INSERT INTO `articles` VALUES (2, 1, 'Статья Васи пупкина');


CREATE TABLE `comments` (
`comment_id` int(6) unsigned NOT NULL auto_increment,
`user_id` int(6) unsigned NOT NULL default '0',
`comment` varchar(255) NOT NULL default '',
PRIMARY KEY (`comment_id`)
) TYPE=MyISAM AUTO_INCREMENT=6 ;


INSERT INTO `comments` VALUES (1, 1, 'Коментарий Васи Пупкина');
INSERT INTO `comments` VALUES (2, 1, 'Коментарий Васи Пупкина');
INSERT INTO `comments` VALUES (3, 1, 'Коментарий Васи Пупкина');
INSERT INTO `comments` VALUES (4, 2, 'Коментарий Иванова');
INSERT INTO `comments` VALUES (5, 2, 'Коментарий Иванова');

CREATE TABLE `users` (
`user_id` int(6) unsigned NOT NULL auto_increment,
`user_name` varchar(50) NOT NULL default '',
PRIMARY KEY (`user_id`)
) TYPE=MyISAM AUTO_INCREMENT=3 ;

INSERT INTO `users` VALUES (1, 'Вася пупкин');
INSERT INTO `users` VALUES (2, 'Иван Иванов');



Связанны они между собой user_id


1)Пробуем посчитать количество коментариев оставленных каждым пользователем
Код:

SELECT users.user_id, users.user_name, count(comments.comment_id) as num_comments FROM users LEFT JOIN comments ON comments.user_id=users.user_id GROUP BY user_id


Результат :

user_id user_name num_comments
----------------------------------------------------------------------
1 Вася пупкин 3
----------------------------------------------------------------------
2 Иван Иванов 2
----------------------------------------------------------------------

Получаеться

Вася пупкин - 3 коментария
Иван Иванов - 2 коментария
Всё правильно.

2)Пробуем посчитать количество статей оставленных каждым пользователем
Код:

SELECT users.user_id, users.user_name, count(articles.article_id) as num_articles FROM users LEFT JOIN articles ON articles.user_id=users.user_id GROUP BY user_id



Результат :
user_id user_name num_articles
-------------------------------------------------------------------
1 Вася пупкин 2
--------------------------------------------------------------------
2 Иван Иванов 0
--------------------------------------------------------------------

Получаеться

Вася пупкин - 2 статьи
Иван Иванов - 0 статей
Всё правильно.

3)Теперь попоробуем узнать и то и другое одним запросом
Код:

SELECT users.user_id, users.user_name, count(comments.comment_id) as num_comments, count(articles.article_id) as num_articles FROM users LEFT JOIN comments ON comments.user_id=users.user_id LEFT JOIN articles ON articles.user_id=users.user_id GROUP BY user_id


Результат :
user_id user_name num_comments num_articles
----------------------------------------------------------------------
1 Вася пупкин 6 6
----------------------------------------------------------------------
2 Иван Иванов 2 0
----------------------------------------------------------------------

Получаеться

Вася пупкин - 6 комментариев 6 статей (а должно быть 3 коментария и 2 статьи)
Иван Иванов - 2 коментария 0 статей (тут всё правильно как ни странно)

Может кто-то сталкивался с подобной проблемой?

MySQL 3
...
Рейтинг: 0 / 0
3 таблицы, count'ы, join'ы и т.п.
    #32737175
wlck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
есть уверенность, что одним запросом этого не добиться
...
Рейтинг: 0 / 0
3 таблицы, count'ы, join'ы и т.п.
    #32737246
132
Вася пупкин - 6 комментариев 6 статей (а должно быть 3 коментария и 2 статьи)
Иван Иванов - 2 коментария 0 статей (тут всё правильно как ни странно)


Странно как раз другое: наличие в результате записи об Иване Иванове. Статей-то у него нет. Имхо, результатом этого запроса должна быть только первая запись (Вася Пупкин - 6 - 6).

З.Ы.: Насколько мне известно, count() считает количество записей , а не количество того, что Вы передадите ему в аргументах.
...
Рейтинг: 0 / 0
3 таблицы, count'ы, join'ы и т.п.
    #32737296
132
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То что запись об иванове имеется обусловленно использованием LEFT JOIN

если использовать INNER JOIN то иванова не будет.


Неужели никто с такой проблемой не сталкивался?
...
Рейтинг: 0 / 0
3 таблицы, count'ы, join'ы и т.п.
    #32737325
Фотография Хрен
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
SELECT users.user_id, users.user_name, count(distinct comments.comment_id) as 
num_comments, count(distinct articles.article_id) as num_articles FROM users LEFT JOIN comments 
using (user_id) LEFT JOIN articles using (user_id) GROUP BY user_id;
...
Рейтинг: 0 / 0
3 таблицы, count'ы, join'ы и т.п.
    #32737797
wlck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хрен
Код: plaintext
1.
2.
3.
SELECT users.user_id, users.user_name, count(distinct comments.comment_id) as 
num_comments, count(distinct articles.article_id) as num_articles FROM users LEFT JOIN comments 
using (user_id) LEFT JOIN articles using (user_id) GROUP BY user_id;


кул, работает ! не знал, что дистинкты в агрегатных функциях используются
...
Рейтинг: 0 / 0
3 таблицы, count'ы, join'ы и т.п.
    #32738190
132
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хрен огромное спасибо, заработало.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / 3 таблицы, count'ы, join'ы и т.п.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]