postgresql - как разбить на столбцы, которые могут иметь много повторяющихся значений? - PullRequest
0 голосов
/ 13 декабря 2018

Скажем, я создаю приложение для социальных сетей со таблицей 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, если это будет проще.Это та же проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...