|
|
|
| есть таблица с инфой о пользователях и еще 2 таблицы (для примера пусть в одной хранятся комментарии к статьям сделанные пользователем, во второй статьй написанные пользователем)
как получить из этих таблиц инфу о пользователе (из таблицы 1), общее количество комментариев у этого пользователя (из табл. 2) и общее кол-во написанных статей пользователем (из табл. 3) одним запросом?
во всех трех таблицах присутствует поле с ID пользователя. | |
|
|
|
|
|
|
|
для: wert
(18.08.2006 в 16:06)
| | Вы это всё хотите одним запросом сделать или несколько тоже подойдут? | |
|
|
|
|
|
|
|
для: cheops
(18.08.2006 в 19:28)
| | одним. Если несколькими тут вопросов нет. | |
|
|
|
|
|
|
|
для: 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
|
| |
|
|
|
|
|
|
|
для: 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
и еще хочу спросить: с точки зрения скорости и нагрузки на сервер лучше делать один сложный запрос или разбивать на несколько простых запросов? | |
|
|
|
|
|
|
|
для: 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 = ....
|
| |
|
|
|