Счетчик сообщений по нескольким таблицам

Banderas

Новичок
Счетчик сообщений по нескольким таблицам

Подскажите, пожалуйста, как решить такую проблему:

Есть таблицы table1, table2, table3 и т.д. (сообщения из разных разделов)
В каждой есть поле name (автор сообщения)

Есть таблица users (пользователи)

Можно ли сделать для этой таблицы (users) поле, в котором бы автоматом считалось количество сообщений для данного юзера по всем таблицам?
 
Demiurg, спасибо за содержательный ответ! И все же, нельзя ли разъяснить?
 
Re: Счетчик сообщений по нескольким таблицам

Автор оригинала: Banderas
Можно ли сделать для этой таблицы (users) поле, в котором бы автоматом считалось количество сообщений для данного юзера по всем таблицам?
Можно, в MySQL версии не ниже 5.1
 
Banderas
это число вычисляется очень быстро. Зачем тебе его отдельно хранить ?
 
Sad Spirit
>>Можно, в MySQL версии не ниже 5.1
:)


Banderas
Если ты хочешь повысить быстродействие своей системы, те тебе придется обновлять это поле самому.
 
Demiurg, чтобы сделать топ самых активных пользователей. А как это можно сделать по другому?

Извините, если задаю глупые вопросы, просто я еще в этом деле новичок...
 
если версия MySQL 4, то можно использовать UNION и временную таблицу
Код:
CREATE TEMPORARY TABLE tt AS
SELECT name , count(*) cnt
FROM table1
GROUP BY name 
UNION
SELECT name , count(*)
FROM table2
GROUP BY name 
UNION
SELECT name , count(*)
FROM table3
GROUP BY name 

SELECT name , sum(cnt) cnt
FROM tt
GROUP BY name
ORDER BY cnt DESC
LIMIT 10
 
chira
я наверное чего-то недопонимаю, но когда даю такой запрос, выходит ошибка:
You have an error in your SQL syntax near 'UNION SELECT name, count( * ) cnt FROM....
 
на 3.23 тогда разбить юнионы на отдельные SQL
Код:
CREATE TEMPORARY TABLE tt AS
SELECT name , count(*) cnt
FROM table1
GROUP BY name 

INSERT INTO tt
SELECT name , count(*)
FROM table2
GROUP BY name 

INSERT INTO tt
SELECT name , count(*)
FROM table3
GROUP BY name
 
В общем, сделал вот так:

CREATE TEMPORARY TABLE top select name FROM table1
insert into top select name FROM table2
insert into top select name FROM table3

SELECT name, COUNT(name) AS cnt FROM top GROUP BY name ORDER BY cnt DESC limit 10

Не слишком ли мудрено?
 
Почему бы не объеденить эти таблицы в одну, и добавить поле идентификатора раздела? Как я понял структрура у них одинаковая или близкая.
Тогда не придется чесать репу когда у тебя (возможно) появится еще один такой раздел и соответсвенно таблица table4
 
Miky
На самом деле разделов (соответственно и таблиц) больше трех и структура таблиц разная, так что объединить их нет возможности.
 
Сверху