Выборка Макс. значения, или последнего ответа...

Yuriy_S

-=PHP-Club=-
Выборка Макс. значения, или последнего ответа...

Привет всем.
Помогите пож-ста с запросом:
в форуме на странице топиков (таблица topic) выводится кол-во сообщений, автор, кол-во просмотров, и время + имя автора последнего сообщения.
Я вывожу из таблицы message функцией MAX() - время, но никак не могу вывести имя (поле avtor, оно содержит имя автора), соответствующее этому времени. Так же в таблице message имеется поле id - в которое пишу mktime().
Вот мой запрос:
PHP:
$result=mysql_query("SELECT t1.*, COUNT(t2.id) AS num, MAX(t2.id) as maxidm, MAX(t2.vrema) as maxid, MAX(t2.avtor) AS avt FROM topic AS t1 INNER JOIN message AS t2 ON t1.id=t2.lid WHERE t1.fid='$forumid' GROUP BY t1.last_time DESC  LIMIT $mn,$kol_top",$con);
Как все же вывести имя автора, соответсвующее этому времени?
 

alpes

Весь мир на ладони
Одним запросом кажись не выйдет. Для одного можно добавить в topic поле LastAvtor. Имхо не заешь где и на чем надо сэкономить... либо здесь на втором запросе, либо раньше на выполнении UPDATE и лишних данных.

С конструкцией INNER JOIN я особо не знаком и доселя такую выборку
PHP:
"поля таб. topic.*, автор топика, к-во сообщений, id последнего ответа, время последнего ответа и  отсортированые в порядке старения сообщений (поле t1.last_time оказывается не нужным)"
совершаю запросом:
PHP:
$result=mysql_query(
"SELECT t1.*, t2.avtor, COUNT(t2.id) AS num, MAX(t2.id) as maxidm, MAX(t2.vrema) as maxid ".
"FROM topic AS t1, message AS t2 ".
"WHERE t1.id=t2.lid AND t1.fid='$forumid' ORDER BY t2.lid GROUP BY maxid DESC  LIMIT $mn,$kol_top",$con);
В чем существенная разница конструкций этих запросов и собственно как более правильно поступать?
Спасибо.
 

Yuriy_S

-=PHP-Club=-
И ещё "можно" обновлять в таблице топиков поле автор, писать туда имя автора последнего ответа. Но я думаю что это скажется на производитеьности...
 

alpes

Весь мир на ладони
>К сожалению, в параметрах Group нельзя указывать псевдонимы таблицы.., он их не понимает

:D А попробывать и убедится?!

ЗЫ. В спешке трохы неправилно скопировал, правильно так:
"GROUP BY t2.lid ORDER BY maxid DESC "
 

alpes

Весь мир на ладони
И ещё "можно" обновлять в таблице топиков поле автор, писать туда имя автора последнего ответа. Но я думаю что это скажется на производитеьности...
Вопрос не в том моно или нет, всеравно будешь делать какойто запрос к БД:
на UPDATE при обновлении или второй запрос при определении автора.
 

ForJest

- свежая кровь
Yuriy_S - я два раза пытался написать тебе ответ, но так и не смог, извини :). Почему-то после написания 500 символов ответ кажется бредом :).
Может переформулируешь менее сумбурно и более структурировано? Ну там отделишь мух от котлет :).
 

Yuriy_S

-=PHP-Club=-
:) вроде и так все понятно написано.
aples - :) ок, сейчас попробую, спасибо.
 

Yuriy_S

-=PHP-Club=-
нет, все таки это не решило мой вопрос...
и ещё,
А попробывать и убедится?!

ЗЫ. В спешке трохы неправилно скопировал, правильно так:
"GROUP BY t2.lid ORDER BY maxid DESC "
ORDER BY maxid, а я то говорю про GROUP BY ...
И ещё повторю свой вопрос:
Мне не нужно выбрать из таблицы автора, соответствующего максимальному времени ответа, а не максимальное время ответа, это я уже сделал. Вот. Если это невозможно, то скажите что нет, т.к запрос Aples-a делает тоже самое что и мой запрос.
 

Yuriy_S

-=PHP-Club=-
Я подожду ответа. И в случае если этот невозможно то буду просто апдейтить поле "автор" в таблице топиков, и запрос будет полегче.
 

chira

Новичок
попробуй:
Код:
CREATE TEMPORARY TABLE msautor
TYPE=HEAP
SELECT autor, MAX(vrema) as vrema, COUNT(id) AS numid
FROM message
WHERE // здесь возможно нужно будет ограничить количество просматриваемых сообщений
vrema >= DATE_SUB(NOW(),INTERVAL 1 DAY)
GROUP BY autor

SELECT t1.*, t3.numid AS num, t2.vrema as maxid, t2.avtor AS avt
FROM topic AS t1 ,message AS t2 , msautor AS t3
WHERE t1.fid='$forumid'
 AND t1.id=t2.lid
 AND t2.autor = t3.autor
 AND t2.vrema = t3.vrema
 

chira

Новичок
еще вариант:
Код:
CREATE TEMPORARY TABLE msautor
TYPE=HEAP
SELECT t2.autor, t2.lid, MAX(t2.vrema) as vrema, COUNT(t2.id) AS numid
FROM topic AS t1 ,message AS t2
WHERE t1.id=t2.lid
  AND t1.fid='$forumid'
GROUP BY t1.autor, t2.lid

SELECT t1.*, t3.numid AS num, t3.vrema as maxid, t3.avtor AS avt
FROM topic AS t1 , msautor AS t3
WHERE t1.id=t3.lid
возможно этот вариант больше подойдет...
 
Сверху