Скажем, я создаю приложение для социальных сетей со таблицей posts
для хранения сообщений и таблицей post_likes
для хранения лайков для определенного поста.Допустим, у меня есть столбец date_posted
в таблице posts
, который является bigint
и содержит значения меток времени Unix.
Чтобы разбить на страницы, мне нужно знать смещение, лимит и начальное значениеочко за каждый выбор из базы данных.Предел и начальная точка поддерживаются постоянными, и, конечно, только смещение изменяется, когда вы все больше и больше просматриваете страницу.
Так, скажем, я делаю пагинацию один раз (с постами, упорядоченными по date_posted DESC
), поэтому я беру больше всегопоследние сообщения в первую очередь.Скажем, (гипотетически) самый последний пост, который я получаю изначально, имеет date_posted
из 10000
.Поэтому на последующих страницах я ограничиваю посты наличием date_posted <= 10000
, поскольку в противном случае он будет захватывать более новые посты, а это не то, что я хочу - я хочу только более старые посты.
Как бы я сделал это с post_likes
?Я запрашиваю
SELECT COUNT(*) FROM posts_likes WHERE posts.id = post_likes.post_id
, чтобы получить количество лайков для каждого поста.Есть ли способ разбить на страницы по этим значениям, например, упорядочение по самым популярным сообщениям?
Основная проблема, с которой я столкнулся, - это "отправная точка".С date_posted
было легко установить эталонный тест с помощью всего лишь WHERE
предложения,
...WHERE date_posted <= 10000...
, чтобы избежать получения новых сообщений, где date_posted
будет больше 10000. Как мне избежать полученияновые посты с количеством лайков?
Пример:
posts
id | date_posted
0 100
1 120
2 300
3 1400
post_likes
id | user_id | post_id
0 uid1 2
1 uid1 3
2 uid2 2
3 uid10 2
4 uid22 3
5 uid4 1
Итак, я хочу, чтобы все посты были упорядочены по самым последним , с лимитом 2
SELECT * FROM posts ORDER BY date_posted DESC LIMIT 2 OFFSET 0
Что дало бы мне
posts
id | date_posted
3 1400
2 300
Пейджинг, сохраняя начальную позицию как 1400, потому что все, что больше, - это более новая запись с
SELECT * FROM posts WHERE date_posted <= 1400 ORDER BY date_posted DESC LIMIT 2 OFFSET 2
даст мне следующие два.
Мой вопрос: как выбрать стартовую позицию при сортировке по наиболее популярным сообщениям?Мой запрос выглядит следующим образом:
SELECT * FROM posts ORDER BY (SELECT COUNT(*) FROM posts_likes WHERE posts.id = post_likes.post_id) DESC LIMIT 2 OFFSET 0
Но когда я перехожу на страницу, как мне перестать получать новые сообщения, так как подкачка означает, что вы хотите получать только старые сообщения?
ПРИМЕЧАНИЕ: Вы можете заменить всю таблицу post_likes
на столбец num_likes
в таблице posts
, если это будет проще.Это та же проблема.