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

Banderas

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

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

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

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

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

Banderas

Новичок
Demiurg, спасибо за содержательный ответ! И все же, нельзя ли разъяснить?
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Re: Счетчик сообщений по нескольким таблицам

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

Demiurg

Guest
Banderas
это число вычисляется очень быстро. Зачем тебе его отдельно хранить ?
 

Falc

Новичок
Sad Spirit
>>Можно, в MySQL версии не ниже 5.1
:)


Banderas
Если ты хочешь повысить быстродействие своей системы, те тебе придется обновлять это поле самому.
 

Banderas

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

Извините, если задаю глупые вопросы, просто я еще в этом деле новичок...
 

Demiurg

Guest
select name , count(id) cnt from table group by name order cnt limit 10
 

chira

Новичок
если версия 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
 

Banderas

Новичок
chira
я наверное чего-то недопонимаю, но когда даю такой запрос, выходит ошибка:
You have an error in your SQL syntax near 'UNION SELECT name, count( * ) cnt FROM....
 

chira

Новичок
на 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
 

Banderas

Новичок
В общем, сделал вот так:

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

Не слишком ли мудрено?
 

Miky

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

Banderas

Новичок
Miky
На самом деле разделов (соответственно и таблиц) больше трех и структура таблиц разная, так что объединить их нет возможности.
 
Сверху