Выберите строку на основе ранга и ранее выбранной строки - PullRequest
3 голосов
/ 14 марта 2012

Я пытаюсь создать систему рейтинга форума, которая может получать по одной записи за раз на основе предыдущей записи.

Пример таблицы:

| POST_ID | POST_REPLIES |
--------------------------
|   1     |        5     | 
|   2     |        2     | 
|   3     |        8     |
|   4     |        8     |
|   5     |        12    |
--------------------------

Если я это сделаюпростой запрос ORDER BY POST_REPLIES DESC, я получаю POST_ID 5, 4, 3, 1, 2.

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

Например: если я сейчас просматриваю пост № 3, то будет кнопка с надписью «следующий пост с наибольшим количеством ответов», которая будет указывать на пост № 4.

У меня сейчас проблемыимея дело с дубликатами, я наталкиваюсь на цикл от 3 до 4 (от 3 до 4 и от 4 до 3, а не 5)

Я поиграл с присоединением таблицы к себе и сравнением строк сПосмотрите, какой из них больше или меньше, но поскольку я использую ограничение 1, строка всегда равна 1 и, таким образом, бесполезна.Итак, основной запрос, который у меня был:

SELECT * FROM posts
   WHERE post_id != '$currentPost' 
   ORDER BY POST_REPLIES DESC, POST_ID DESC LIMIT 1

Как я могу это сделать?

Ответы [ 3 ]

1 голос
/ 14 марта 2012

Первый шаг, который вам понадобится, - это «ранжировать» результаты.Лучший способ сделать это в MySQL - использовать такую ​​переменную:

SELECT posts.post_id, posts.post_replies, @rank := @rank + 1 AS rank
FROM posts, (SELECT @rank := 0) r

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

1 голос
/ 15 марта 2012
SELECT p.*
FROM (
  SELECT POST_ID, POST_REPLIES
  FROM posts
  WHERE POST_ID = @currentId) as cur
JOIN posts p 
  ON p.POST_REPLIES >= cur.POST_REPLIES
  AND p.POST_ID > cur.POST_ID
ORDER BY p.POST_REPLIES DESC, p.POST_ID
LIMIT 1 ;
0 голосов
/ 14 марта 2012

Предел с использованием диапазона, например

 limit 0,1

где ноль - начальная запись, а одна - количество записей для извлечения.

 limit 5,1

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

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

...