LINUX.ORG.RU

[MySQL]сортировка постов на форуме.


0

1

Задача такая: есть форум, там есть посты. Есть посетители, которые эти посты читают (иногда они ещё и пишут). Есть две таблицы: в одной лежат собственно посты на форуме, во второй записано, когда какой юзер читал какой пост.

Вопрос, как отсортировать посты на этом форуме, в порядке последнего прочтения.

Т.е. сначала посты, которые юзер вообще не читал, потом посты, которые он давно не читал, и в самом конце посты, которые он только-что прочитал.

Может нужно каждому юзеру создать персональную таблицу, или есть способ проще?

★★

Может нужно каждому юзеру создать персональную таблицу, или есть способ проще?

Хороший, годный способ. :)

anonymous ()
Ответ на: комментарий от anonymous

можно еще каждому комменту по таблице а треду у юзеру по бд )))

anonymous ()

В чём сложность то? Берёшь из таблицы

во второй записано, когда какой юзер читал какой пост

записи для данного пользователя, отсортированные по времени прочтения поста. Потом берёшь эти посты по их id-кам, которые получил из первого запроса, из второй таблицы. Что не так?

roy ★★★★★ ()
Ответ на: комментарий от roy

записи для данного пользователя, отсортированные по времени прочтения поста. Потом берёшь эти посты по их id-кам, которые получил из первого запроса, из второй таблицы. Что не так?

сложность в том, что в таблице посещений (в которой записано время посещения пользователем), нету постов, которые юзер вообще никогда не читал. А показать их нужно. Тут как я понимаю, нужно в одном запросе объединить обе таблицы, что-бы получить и неизвестные посты, и те, которые юзер уже прочитал. А вот как - мне что-то не сообразить.

Тут даже не в запросе дело - сам запрос я составлю (с временной таблицей например), хотелось-бы узнать, что думает LOR на тему, в каком порядке должны идти посты для пользователя, что-бы ему было максимально удобно.

drBatty ★★ ()
Ответ на: комментарий от r2d2

by время прочтения

новые посты, которые юзер не читал не нужны? ИМХО они-то ему как раз нужны в первую очередь.

Склоняюсь к мысли, что тут надо сгруппировать, и сначала выдать все посты, которые юзер НЕ читал в порядке их написания, а потом выдать те, которые читал, в порядке прочтения. Ну если LOR не знает, то я пойду покурю манул, как составить такой запрос...

drBatty ★★ ()
Ответ на: комментарий от drBatty

Ну выгребаешь ВСЕ посты, вычитаешь из них те посты, которые есть во второй таблице (прочитанные), выводишь их, затем выводишь те, что прочитал. Не мог понять что не устраивает. Да, это логичный подход - показывать пользователю все новые посты первыми.

roy ★★★★★ ()

Как-то так

select t1.time,t2.post_text from t1 right join t2 on  (t2.post_id = t1.post_id) order by t1.time desc
Может, и не работает - но смысл такой

Shtsh ★★★★ ()
Ответ на: комментарий от stack_protector

3) qsort

ух ты! пост №в7099313+ не устаёт меня радовать - что мне скажут, когда у меня qsort будет 7 000 000+ постов сортировать?! Так-то я и сам могу...

drBatty ★★ ()
Ответ на: комментарий от Shtsh

Может, и не работает - но смысл такой

Спасибо. Однако я тут подумал, что t1 (список топиков) тут вообще не нужна - непрочитанные топики есть ведь и в t2 - их ведь кто-то читал, хотя-бы тот, кто их писал. Потому достаточно просто запросить выборку t2.

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

drBatty ★★ ()
Ответ на: комментарий от Shtsh

Обязательно одним запросом? Двумя делается значительно проще.

проще-то проще. Вот только мне нужно в разных частях выхлопа по разному сортировать - т.е. сначала ORDER BY time_create, а потом ORDER BY time_read.

drBatty ★★ ()
Ответ на: комментарий от drBatty

Если ты разбиваешь посты на страницы, то есть вопрос

Когда посты становятся прочитанными? Если сразу, как только они стали видны пользователю, то при переходе к следующей странице пользователь будет пропускать новый посты одной страницы, так как посты первой страницы будут попадать в конец нового списка, а пользователю будут показаны посты 2-й страницы нового списка, т.е. 3-й страницы старого списка.

То что ты хочешь можно сделать как-то так:

SELECT post.id FROM post LEFT JOIN read ON post.id=read.post_id WHERE read.user_id=? ORDER BY read.post_id IS NULL DESC, IFNULL(read.read_date, post.create_date)

anonymous ()
Ответ на: комментарий от anonymous

Когда посты становятся прочитанными? Если сразу, как только они стали видны пользователю, то при переходе к следующей странице пользователь будет пропускать новый посты одной страницы, так как посты первой страницы будут попадать в конец нового списка, а пользователю будут показаны посты 2-й страницы нового списка, т.е. 3-й страницы старого списка.

дык это не посты, а список тем(топиков). Как здесь лента www.linux.org.ru/forum/lenta/ Естественно, топик не считается прочитанным, если его в ленте увидел. Вот если туда зайти, то да - прочитанный. Потому этой проблемы не возникает.

SELECT post.id FROM post LEFT JOIN read ON post.id=read.post_id WHERE read.user_id=? ORDER BY read.post_id IS NULL DESC, IFNULL(read.read_date, post.create_date)

угу. Спасибо.

drBatty ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.