Как создать простой список статей в базе данных MySQL, который можно получить только одним запросом? - PullRequest
0 голосов
/ 21 декабря 2009

У меня есть разбитый на страницы список статей, которые нужно отсортировать по рангу, но когда статья имеет позицию <> 0, она должна быть вставлена ​​в эту конкретную позицию. Я думал, что смогу по крайней мере получить статьи с правильной позицией, извлеченной для текущей страницы, а затем отсортировать их в PHP, чтобы затем показать в правильном положении. Я хочу сделать это в MySQL только с одним запросом

Некоторые из моих попыток:

Этот запрос пытается сначала выбрать статьи, которые имеют правильную позицию для текущей страницы, а затем статьи с самым высоким рангом

SELECT id, rank_score, position
FROM Articles
ORDER BY ((position <= (50 * 1)) AND (position > 50 * (1-1))) DESC, rank_score DESC
LIMIT 0, 50

50 - количество статей, отображаемых на странице, а 1 - номер текущей страницы, они добавляются при генерации запроса.

В этом запросе проблема заключается в том, что на странице 2 результаты неверны, поскольку, добавив LIMIT 50,50, вы можете выйти за рамки статей, которые имеют позицию на этой странице.

Еще одна попытка:

SELECT (
    SELECT id, rank_score, position
      FROM Articles
  ORDER BY ((position <= (50 * 1)) AND (position > 50 * (1-1))) DESC, rank_score DESC  
     LIMIT 50)
UNION (
  SELECT id, rank_score, position
    FROM Articles
 ORDER BY rank_score DESC LIMIT x)

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

Ответы [ 4 ]

11 голосов
/ 21 декабря 2009

Ваше первое выражение ORDER BY не слишком сложное. Попробуйте:

ORDER BY ((position < (50 * (1 + (1-1 * (50 / 1)))) 
    OR position = (50 + (50 - (50 * POW(50, 0)) * 1))) 
  AND (position > 50 * (1-1) / 1 * 50)) DESC

Альтернативно, просто используйте:

ORDER BY (position <= 50 AND position > 0) DESC

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

1 голос
/ 22 декабря 2009

да, волшебный единорог прав, этот запрос неправильный вот настоящий магический запрос

SELECT * FROM (
SELECT @rownum:=@rownum+1 rownum, IF(position=0,@rownum,position) as loc, a.id, a.rank_score, a.position
FROM (SELECT @rownum:=0) r, Articles a
ORDER BY rank_score DESC) t 
ORDER BY loc DESC
LIMIT 0, 50
0 голосов
/ 22 декабря 2009

одно незначительное наблюдение, которое волшебный единорог мог видеть в последнем запросе - вы упорядочиваете набор результатов в поле (loc), основанном на другом поле (@rownum), которое, как вы ожидаете, будет иметь значения, основанные на отсортированном наборе , Мистический? Круговые зависимости? Или просто странно? ; -)

0 голосов
/ 22 декабря 2009

Я нашел ответ на вопрос. Я отказался от решения для сортировки sql + php и нашел полное решение для sql, где я получаю все статьи, отсортированные по рангу и позиции, где это возможно.

SELECT @rownum:=@rownum+1 rownum, IF(position=0,@rownum,position) as loc, a.id, a.rank_score, a.position
FROM (SELECT @rownum:=0) r, Articles a
ORDER BY  loc, rank_score DESC
LIMIT 0, 50
...