Помогите с запросом

  • Автор темы AlexDreamer
  • Дата начала

AlexDreamer

Guest
Помогите с запросом

Есть таблица сообщений посетителей (например форума) типа
(
userid..., - код посетителя
message..., - сообщение
themeid - код темы
)

нужно выбрать сообщения по одной теме + поле содержащее количество сообщений ПО ВСЕМ ТЕМАМ посетителя, который поместил это сообщение
надеюсь объяснил понятно.

Спасибо
 

Demiurg

Guest
select themeid , count(message) from table where userid = ... group by themeid
 

AlexDreamer

Guest
Автор оригинала: Demiurg
select themeid , count(message) from table where userid = ... group by themeid
наверно я таки непонятно объяснил.
этот запрос выбирает все по одному посетителю. а мне нужно все по одной теме: ... where themeid=...

и кажая запись должна содержать код посетителя + количество ВСЕХ сообщений по ВСЕМ темам, которые это посетитель сделал.

может я много хочу и одним запросом это не сделать?
 

AlexDreamer

Guest
Не подскажите как?

Проще всего загнать результат
запрос select userid, count(*) from messages group by userid
в массив и выбирать значение по коду. Но большом кол-ве посетителей, участвующих в переписке запрос выдаст длинный список. В теме же может участвовать 5-10 посетителей + тема может быть разбита на страницы.

Мамсимум до чего я додумался (тут не пинайте сильно) это выбрать сообщения, которые будут на странице, в массив. Перебрав его получить массив пользователей и тогда уже
select count(*) from comments where userid in (1,2,3,...) group by userid
 

Falc

Новичок
Пользователей все равно придеться вытаскивать из бызы, так что проще сделать через IN(...), и не запариваться на CREATE TEMPORARY
 

chira

Новичок
Код:
CREATE TEMPORARY TABLE t1 
SELECT userid, count(*) cn_tema10
FROM forum
WHERE themeid = 10
GROUP BY 1;

SELECT f.userid, count(*) total_count, t1.cn_tema10
FROM forum f , t1
WHERE f.userid = t1.userid
GROUP BY 1;
 

Falc

Новичок
Автор оригинала: chira
Код:
CREATE TEMPORARY TABLE t1 
SELECT userid, count(*) cn_tema10
FROM forum
WHERE themeid = 10
GROUP BY 1;

SELECT f.userid, count(*) total_count, t1.cn_tema10
FROM forum f , t1
WHERE f.userid = t1.userid
GROUP BY 1;
Только вот если у тебя тема будет разбита на десятки страниц, то у тебя пойдет куча лишних действий и тормозить будет не хило. Особенно если у многих пользователей которые в ней участвуют будет по несколько сотен или даже тысяц сообщений.
 

fixxxer

К.О.
Партнер клуба
[sql]create temporary table t1 (unique(uid),key(cnt)) type=heap select userid as uid, count(*) as cnt cn_tema10
FROM forum
WHERE themeid = 10
GROUP BY 1;[/sql]
так побыстрее:)
 

Falc

Новичок
Автор оригинала: fixxxer
[sql]create temporary table t1 (unique(uid),key(cnt)) type=heap select userid as uid, count(*) as cnt cn_tema10
FROM forum
WHERE themeid = 10
GROUP BY 1;[/sql]
так побыстрее:)
Дело в том что тормоза пойдут не только из-за отстутствия индексов. но и из-за того что вычислять придеться COUNT для всех участников темы, в то время как на одной странице темы их может быть сильно меньше чем во всей теме.

А вообще если форум планируеться Очень большим, и у многих участников будет по несколько тысяц сообщений то кол-во постов лучще хранить как атрибут участника, иначе постояно будет куча лишних вычислений.
 

chira

Новичок
fixxxer
по дефаулту временная таблица создается как HEAP
и индекс для HEAP - спорный вопрос ...
 

Falc

Новичок
Автор оригинала: chira
fixxxer
по дефаулту временная таблица создается как HEAP
и индекс для HEAP - спорный вопрос ...
Все зависит от кол-ва записей, но вот на cnt кей точно не нужен :)
 

fixxxer

К.О.
Партнер клуба
Почему не нужен? Вроде автор топика по нему сортировать собирался.
 

Falc

Новичок
Автор оригинала: fixxxer
Почему не нужен? Вроде автор топика по нему сортировать собирался.
Это как сортировать сообщения по кол-ву постов у того кто их запостил?
Интересно как такой форум можно будет читаь.
 

AlexDreamer

Guest
Момент :)

Где я говорил, что сортировка по количеству?
Просто в каждой записи должно быть кол-во всех сообщений посетителя.
Сортировка обычная.
 

AlexDreamer

Guest
И если я не ошибаюсь, здесь...

= HEAP SELECT userid AS uid, count( * ) AS cnt cn_tema10
FROM forum
WHERE themeid = 10
подсчитывается количество сообщений в ДАННОЙ теме, а не по всем.
 

Falc

Новичок
Автор оригинала: AlexDreamer
Момент :)

Где я говорил, что сортировка по количеству?
Просто в каждой записи должно быть кол-во всех сообщений посетителя.
Сортировка обычная.
Короче если форум будет у тебя не большой, то делай так как ты и написал выбирая через IN(...) только тех пользователей которые присутствуют только на данной странице.
Если форум будет большим, то заведи в табличке пользователей поле для хранения кол-ва сообщений данного пользователля, а не расчитывае его при каждом просмотре страницы форума.
 

Falc

Новичок
Автор оригинала: AlexDreamer
И если я не ошибаюсь, здесь...


подсчитывается количество сообщений в ДАННОЙ теме, а не по всем.
Там подсчитываються оба кол-ва.
 

fixxxer

К.О.
Партнер клуба
В Invision Board , например, вообще для всех дел count()-ового рода заведены поля в таблицах, в которые count()-ы при обновлении синхронизируются. И это правильно.
 
Сверху