2010-08-24 3 views
3

Я создал функцию, где пользователи могут создавать новые темы (похожие на форумы). В настоящий момент на странице, запрос по темам следующим образом:Сортировка постов в другой таблице

$q = "SELECT ".TBL_COMMUNITYTHREADS.".title, ".TBL_COMMUNITYTHREADS.".id, 
    ".TBL_COMMUNITYTHREADS.".date, ".TBL_COMMUNITYTHREADS.".author, ".TBL_USERS.".username FROM ".TBL_COMMUNITYTHREADS." 
     INNER JOIN ".TBL_USERS." ON ".TBL_COMMUNITYTHREADS.".author = ".TBL_USERS.".id 
     WHERE type = '$type' 
     ORDER BY date DESC LIMIT $offset, $rowsperpage "; 

Таблицы констант и смещения и rowsperpage переменные, передаваемые, чтобы ограничить количество сообщений находятся на одной странице.

В настоящий момент все темы заданы по дате. Я хочу, чтобы их заказали по последнему ответу. Как и в форумах, когда ответ внутри темы самый новый, эта тема будет идти вверх.

Темы хранятся в tbl_communitythreads и ответах в tbl_communityreplies.

Как я могу заказать их по последнему ответу.

Они связаны потоком в tbl_communityreplies. Также в этом столбце даты.

Благодарю за чтение, я просто не могу подумать, как это сделать.

ответ

1

Это:

SELECT c.title, c.id, c.date, c.author, u.username, 
     (
     SELECT MAX(reply_date) 
     FROM tbl_communityreplies cr 
     WHERE cr.thread = c.id 
     ) AS last_reply 
FROM TBL_COMMUNITYTHREADS c 
JOIN TBL_USERS u 
ON  u.id = c.author 
ORDER BY 
     last_reply DESC, c.id DESC 
LIMIT $offset, $rowsperpage 

или это:

SELECT c.title, c.id, c.date, c.author, u.username 
FROM (
     SELECT cr.thread, cr.reply_date, cr.id 
     FROM tbl_communityreplies cr 
     WHERE (cr.last_reply, cr.id) = 
       (
       SELECT last_reply, id 
       FROM tbl_communityreplies cri 
       WHERE cri.thread = cr.thread 
       ORDER BY 
         thread DESC, last_reply DESC, id DESC 
       ) 
     ORDER BY 
       last_reply DESC, id DESC 
     LIMIT $offset, $rowsperpage 
     ) q 
JOIN TBL_COMMUNITYTHREADS c 
ON  c.id = q.thread 
JOIN TBL_USERS u 
ON  u.id = c.author 
ORDER BY 
     q.reply_date DESC, q.id DESC 

Прежний запрос более эффективен при больших значениях $offset, или если у вас есть несколько потоков с большим количеством ответов.

Issue следующие команды:

CREATE INDEX ix_communitythreads_replydate_id ON TBL_COMMUNITYTHREADS (reply_date, id) 
CREATE INDEX ix_communitythreads_thread_replydate_id ON TBL_COMMUNITYTHREADS (thread, reply_date, id) 

для этого, чтобы работать быстро.

+0

Здравствуйте, спасибо за ответ. Что вы понимаете, создавая следующие индексы? – sark9012

+0

@ Luke: индексы являются теневыми копиями данных в некоторых столбцах таблицы, упорядоченными по значениям этих столбцов. Они помогают повысить производительность запросов. – Quassnoi

+0

Я расскажу об этом и узнаю больше об этом. Я использовал первый запрос и изменил его в соответствии с моей системой. Работает отлично, спасибо очень много! – sark9012

0

присоединитесь с другой таблицей, затем вы можете заказать по столбцу из этой таблицы.

Смежные вопросы