|
|
|
3 таблицы, count'ы, join'ы и т.п.
|
|||
|---|---|---|---|
|
#18+
Привет всем! У меня возникла проблема. Есть три таблицы пользователи (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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2004, 18:22 |
|
||
|
3 таблицы, count'ы, join'ы и т.п.
|
|||
|---|---|---|---|
|
#18+
есть уверенность, что одним запросом этого не добиться ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2004, 19:46 |
|
||
|
3 таблицы, count'ы, join'ы и т.п.
|
|||
|---|---|---|---|
|
#18+
132 Вася пупкин - 6 комментариев 6 статей (а должно быть 3 коментария и 2 статьи) Иван Иванов - 2 коментария 0 статей (тут всё правильно как ни странно) Странно как раз другое: наличие в результате записи об Иване Иванове. Статей-то у него нет. Имхо, результатом этого запроса должна быть только первая запись (Вася Пупкин - 6 - 6). З.Ы.: Насколько мне известно, count() считает количество записей , а не количество того, что Вы передадите ему в аргументах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2004, 22:06 |
|
||
|
3 таблицы, count'ы, join'ы и т.п.
|
|||
|---|---|---|---|
|
#18+
То что запись об иванове имеется обусловленно использованием LEFT JOIN если использовать INNER JOIN то иванова не будет. Неужели никто с такой проблемой не сталкивался? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2004, 00:22 |
|
||
|
3 таблицы, count'ы, join'ы и т.п.
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2004, 02:31 |
|
||
|
3 таблицы, count'ы, join'ы и т.п.
|
|||
|---|---|---|---|
|
#18+
Хрен Код: plaintext 1. 2. 3. кул, работает ! не знал, что дистинкты в агрегатных функциях используются ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2004, 11:18 |
|
||
|
|

start [/forum/topic.php?fid=47&gotonew=1&tid=1854728]: |
0ms |
get settings: |
7ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
156ms |
get topic data: |
9ms |
get first new msg: |
5ms |
get forum data: |
2ms |
get page messages: |
42ms |
get tp. blocked users: |
1ms |
| others: | 213ms |
| total: | 451ms |

| 0 / 0 |
