如何在MySQL数据库中创建一个简单的粘性位置文章列表,只需一个查询即可检索?

cod*_*bly 0 mysql sql position rank

我有一个分页的文章列表需要按排名排序,但当文章的位置<> 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
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

要正常工作,第二个查询的限制必须等于第一个查询返回的行数.此外,任何时候一个具有非常高的排名,但也是非常高的位置的文章,它将在前面显示,因为在第二个查询中忽略了位置.

Sho*_*og9 11

你的第一个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
Run Code Online (Sandbox Code Playgroud)

或者,只需使用:

ORDER BY (position <= 50 AND position > 0) DESC
Run Code Online (Sandbox Code Playgroud)

我建议复杂化(或者,如果必须,简化)表达式的其余部分.我预测你要么找到你的问题,要么在另一个宇宙中打开一个洞,其中神奇的独角兽将解决你的问题.

  • 最好.回答.永远. (4认同)
  • @codeassembly:是的,我知道了.我的观点是,你使这个过于复杂,并且(显然)因此而感到困惑.开始*简单:*您真正想要的是一个排序顺序,无论您要求哪个页面都保持**一致:LIMIT将负责其余部分.你忽略了在表达式中指定变量,但那是无关紧要的,因为如果你想让分页工作,你根本不应该在该表达式中有变量...... (2认同)