Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> счетчик сообщений 
V
    Опции темы
DrNemo
Дата 3.9.2009, 09:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 193
Регистрация: 7.12.2005
Где: Не пейте ракетное топливо! :-)

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



Добрый день.
Возникла проблема. Есть 3 базы:

user
id,login,...

post
id,id_user,...

comment
id,id_user,...

в итоге нужно получить:
id,login,count(post.id),count(comment.id)

пробовал использовать LEFT JOIN, но он работает адекватно, тока при одном коунте или я не правильно выбирал поле для группировки
Код

SELECT user.*, count(post.id) post, count(comment.id) comment FROM db_user user
 LEFT JOIN db_post post ON post.id_user = user.id 
 LEFT JOIN db_comment comment ON comment.id_user = user.id 
WHERE user.id =1
 GROUP BY user.id
 ORDER BY post,comment DESC

зарание спасибо.
--------------------
На свете есть только две вещи которые сносят башню - космос и женщины (К.Ю.Бунин)Самый мастдаевский сакс в том, что рулезные фичи глючат :))
PM MAIL WWW ICQ   Вверх
Ипатьев
Дата 3.9.2009, 09:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



все примерно так, только двумя запросами
PM MAIL   Вверх
DrNemo
Дата 3.9.2009, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 193
Регистрация: 7.12.2005
Где: Не пейте ракетное топливо! :-)

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



через UNION?
--------------------
На свете есть только две вещи которые сносят башню - космос и женщины (К.Ю.Бунин)Самый мастдаевский сакс в том, что рулезные фичи глючат :))
PM MAIL WWW ICQ   Вверх
Akina
Дата 3.9.2009, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


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

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



У тебя неверный подход. В принципе. У тебя, пусть и через таблицу юзеров, получаются связаны таблицы постов и каментов. Чего на самом деле нет и быть не может. 
Должно быть нечто типа (писано на коленке, не проверял)

Код

SELECT user.*, sum(post) post, sum(comment) comment
FROM db_user user
INNER JOIN
(
 (
  SELECT user.id, count(post.id) post, 0 comment
  FROM db_user user
  LEFT JOIN db_post post 
  ON post.id_user = user.id 
  WHERE user.id =1
  GROUP BY user.id
 )
 UNION
 (
  SELECT user.id, 0, count(comment.id)
  FROM db_user user
  LEFT JOIN db_comment comment
  ON comment.id_user = user.id 
  WHERE user.id =1
  GROUP BY user.id
 )
) subquery
ON user.id=subquery.id
ORDER BY post,comment DESC


Добавлено @ 09:26
В зависимости от объёма таблиц при необходимости отбора нескольких юзеров по списку этот отбор или оставляется в подчинённых запросах, или выносится во внешний запрос.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Ипатьев
Дата 3.9.2009, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



через union не обзательно.
можно просто выполнить два запроса по очереди
PM MAIL   Вверх
Akina
Дата 3.9.2009, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


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

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



Или посмотри вот такое (тоже прямо тут ляпал):

Код

SELECT user.*, posts.post, comments.comment
FROM db_user user
LEFT JOIN
(
  SELECT id_user, count(id_user) post
  FROM db_post 
  GROUP BY id_user
) posts
ON user.id=posts.id_user
LEFT JOIN
(
  SELECT id_user, count(id_user) comment
  FROM db_comment
  GROUP BY id_user
) comments
ON user.id=comments.id_user
WHERE user.id =1
ORDER BY post,comment DESC



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
DrNemo
Дата 3.9.2009, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 193
Регистрация: 7.12.2005
Где: Не пейте ракетное топливо! :-)

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



спасибо Akina.
проблема решина
--------------------
На свете есть только две вещи которые сносят башню - космос и женщины (К.Ю.Бунин)Самый мастдаевский сакс в том, что рулезные фичи глючат :))
PM MAIL WWW ICQ   Вверх
Zloxa
Дата 3.9.2009, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


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

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



Цитата(Ипатьев @  3.9.2009,  09:27 Найти цитируемый пост)
можно просто выполнить два запроса по очереди 

Два запроса по очереди дадут согласованный результат далеко не при всех уровнях изоляции тразнакций

Код

SELECT user.*, count(distinct post.id) post, count(distinct comment.id) comment FROM db_user user
 LEFT JOIN db_post post ON post.id_user = user.id 
 LEFT JOIN db_comment comment ON comment.id_user = user.id 
WHERE user.id =1
 GROUP BY user.id
 ORDER BY post,comment DESC



--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




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


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

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