Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Многотабличный запрос
 
 автор: wert   (18.08.2006 в 16:06)   письмо автору
 
 

есть таблица с инфой о пользователях и еще 2 таблицы (для примера пусть в одной хранятся комментарии к статьям сделанные пользователем, во второй статьй написанные пользователем)

как получить из этих таблиц инфу о пользователе (из таблицы 1), общее количество комментариев у этого пользователя (из табл. 2) и общее кол-во написанных статей пользователем (из табл. 3) одним запросом?

во всех трех таблицах присутствует поле с ID пользователя.

   
 
 автор: cheops   (18.08.2006 в 19:28)   письмо автору
 
   для: wert   (18.08.2006 в 16:06)
 

Вы это всё хотите одним запросом сделать или несколько тоже подойдут?

   
 
 автор: wert   (18.08.2006 в 20:23)   письмо автору
 
   для: cheops   (18.08.2006 в 19:28)
 

одним. Если несколькими тут вопросов нет.

   
 
 автор: Trianon   (18.08.2006 в 20:29)   письмо автору
 
   для: wert   (18.08.2006 в 16:06)
 


SELECT user.name, 
  count(letters.id) as num_of_letters,
  count(comments.id) as num_of_comments
FROM users
LEFT JOIN letters ON users.id = letters.user_id
LEFT JOIN comments ON users.id = comments.user_id

   
 
 автор: wert   (18.08.2006 в 21:21)   письмо автору
 
   для: Trianon   (18.08.2006 в 20:29)
 

я примерно так и делал и не получилось...

для конкретного пользователя:

  
SELECT user.name,
 count(letters.id) as num_of_letters, 
  count(comments.id) as num_of_comments 
FROM users 
LEFT JOIN letters ON users.id = letters.user_id 
LEFT JOIN comments ON users.id = comments.user_id
GROUP BY users.id
HAVING users.id=$id


если без GROUP BY - MySql ругается - Mixing of GROUP columns (MIN(),MAX(),COUNT()...) with no GROUP columns is illegal if there is no GROUP BY clause

если подставить GROUP BY - запрос срабатывает, но выводит не правильно значение count (они получаются одинаковые и равные произведению друг на друга)
Наверно проблема в GROUP BY

и еще хочу спросить: с точки зрения скорости и нагрузки на сервер лучше делать один сложный запрос или разбивать на несколько простых запросов?

   
 
 автор: Trianon   (18.08.2006 в 21:25)   письмо автору
 
   для: wert   (18.08.2006 в 21:21)
 

А ведь верно.
Нужно независимо получать counts и после этого join'ом стыковать результаты
SELECT user.name, ltrs,cmts FROM users
JOIN (SELECT user.id as ulid, count(letters.id) as ltrs,  
  FROM users  
  LEFT JOIN letters ON users.id = letters.user_id  
  GROUP BY ulid ) as TL ON users.id =ulid
JOIN (SELECT user.id as ucid, count(comments.id) as cmts,  
  FROM users  
  LEFT JOIN comments ON users.id = comments.user_id  
  GROUP BY ucid ) as TC ON users.id =ucid

-- WHERE user.id = ....

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования