Выборка по нескольким таблицам

Gride

Новичок
Выборка по нескольким таблицам

Всем привет!
При переделке и оптимизации форума возник такой вопрос:
В форуме есть таблицы members, topics и replies, соответственно для участников, тем и сообщений.

В форуме можно посмотреть профайл пользователя, где выводится дата регистрации, город, мыло, вебстраница и др. Все эти данные лежат, естественно, в таблице members и извлекаются оттуда запросом
SELECT * FROM members WHERE id = число.

Также в профайле выводится число тем, созданных этим пользователем и число его постов. Это можно получить с помощью запросов

SELECT COUNT(*) FROM topics WHERE author=число
SELECT COUNT(*) FROM replies WHERE author=число

где число - id пользователя из таблицы members

Можно ли все это сделать одним запросом, а не тремя?
Вроде как это можно сделать через LEFT JOIN, но прочитав мануал по MySQL я не понял синтаксис выборки одновременно по трем таблицам. Эксперименты в этой области успехом не увенчались.

Я поковырял разные форумы, так там в таблице members есть специальные поля, которые увеличиваются на 1 при создании тем и отправке постов, но зачем хранить данные, которые в любой момент можно подсчитать.
Вопрос не суть как актуален для профайла (один запрос или три), но подобный алгоритм понадобится и для создания списка всех участников форума. При выводе 20 записей на страницу два запроса в цикле - это уже 40 запросов.
 

Nirva

Dmitry Polyakov
count(`id`) from `topics` group by `author`
это один запрос
да в общем и пердыдущих два запроса без группировки, вроде, работать не должны.
 

Falc

Новичок
Gride
>>но зачем хранить данные, которые в любой момент можно подсчитать.
Зачем нагружать процессор подсчетом. если можно просто хранить в специальном поле.

Одновремено считать 2 разных каунта в одном запросе, очень не производительно.

-~{}~ 18.06.04 17:33:

Nirva
>>да в общем и пердыдущих два запроса без группировки, вроде, работать не должны.

Это ты с чего взял?
 

Nirva

Dmitry Polyakov
Falc
>>Это ты с чего взял?
с мануала, ты используешь where. без группировки ты можешь каунтом подсчитать только количество не пустых, и запрос выглядит так:
select count(*) from `posts`

мануал:
mysql> SELECT owner, COUNT(owner) FROM pet;
ERROR 1140 at line 1: Mixing of GROUP columns (MIN(),MAX(),COUNT()...)
with no GROUP columns is illegal if there is no GROUP BY clause
 

Falc

Новичок
Nirva
Чуствуешь разницу:
SELECT owner, COUNT(owner) FROM pet;
и
SELECT COUNT(owner) FROM pet;
 

Gride

Новичок
Значит, советуете хранить эти нещастные числа в специальных полях таблицы members?
 
Сверху