SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 12.07.2009 04:30:36

Gefest
Участник
Зарегистрирован: 12.07.2009
Сообщений: 6

Объединенный запрос

Есть таблицы themes, messages
Хочу сделать запрос, выбирающий название тем, количество сообщений в каждой теме, ник автора первого поста каждой темы, ник автора последнего поста. В мускуле пока не особо шарю, но вот что нашаманил

SELECT t.name, t.id, m.nick COUNT(m.id) AS count FROM
themes AS t LEFT JOIN messages AS m ON t.id = m.tid WHERE t.fid = '".$fid."' GROUP BY t.id, t.name ORDER BY t.time DESC


themes
------------------------------------------------------
id | fid | name | time
-------------------------------------------------------
1 | 1 | Васина тема | 123478
2 | 1 | Тема другого автора |123456

messages
------------------------------------------------
id | tid | nick | message
------------------------------------------------
1 | 1 | vasya | текст Васи
2 | 1 | petya | текст Пети
3 | 1 | denis | текст ....

Нужно получить результирующий массив, распечатав, который

Васина тема / автор vasya / последнее сооб. denis / сообщений 3
Тема другого автора / ........... / ........... / ...

никак не могу придумать, как сделать вывод автора последнего сообщения.

Неактивен

 

#2 13.07.2009 23:24:12

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Объединенный запрос

GROUP BY делает группировку по определенным полям (и неявную сортировку). Если Вы указали в SELECT поля, по которым не производится группировка без агрегирующих функций (MAX, SUM, AVG, GROUP_CONCAT, ...), то MySQL выберет произвольного представителя группы. Стандарт SQL запрещает такие запросы, но MySQL, к сожалению, их обрабатывает из-за чего возникают непредзказуемые запросы.

Таким образом, ваш запрос не гарантирует вам выдачу автора первого поста.
Для этого вам необходимо внести в таблицу messages поле, содержащее время добавления сообщения - message_time.

Нужный вам запрос будет выглядеть следующим образом:


select t.name,
(select count(*) from messages m
 where m.tid=t.id),
(select nick from messages m
 where m.tid=t.id order by message_time limit 1) as first_poster,
(select nick from messages m
 where m.tid=t.id order by message_time desc limit 1) as last_poster
from themes t where fid=$fid;
 


Однако работать такой запрос будет очень долго. Лучше подумать какую дополнительную информацию стоит хранить в таблице themes.
Посмотрите структуру таблиц различных форумов. Например, в phphbb в таблице с темами хранится инфа об авторе топика, первом и последнем сообщениях.

Неактивен

 

#3 14.07.2009 00:26:19

Gefest
Участник
Зарегистрирован: 12.07.2009
Сообщений: 6

Re: Объединенный запрос

vasya, большое спасибо!

Отредактированно Gefest (14.07.2009 04:08:34)

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson