我有一个与我目前正在进行的项目有关的问题。 在我的脚本中,所有帖子目前都以这种方式显示:
$sql = "SELECT * FROM posts"
. "\n WHERE page_slug = '" . $this->slug . "'"
. "\n AND active = '1'"
. "\n ORDER BY id DESC" . $pg->limit;
$result = $db->fetch_all($sql);
这很好,虽然现在的问题是,我希望某个项目首先显示在所有其他项目之前。我试图给这个特定项目一个非常高的ID(例如1000),但是如果我创建一个新帖子,新帖子ID突然以1001开始并且它跳到第一个位置。
有没有人知道如何避免这种情况发生,或者至少我如何通过某种方式调整排序顺序来“欺骗”特定项目在第一个位置?
一些建议将受到高度赞赏。
非常感谢, 帕特里克
答案 0 :(得分:2)
$sql = "SELECT *, case when id = 1000 then 0 else 1 end as OrderMe FROM posts"
. "\n WHERE page_slug = '" . $this->slug . "'"
. "\n AND active = '1'"
. "\n ORDER BY OrderMe, id DESC" . $pg->limit;
$result = $db->fetch_all($sql);
当然你不必在case语句中使用1000作为id,但你提到那是你想要的那个id ...
答案 1 :(得分:2)
正如你所说,你可以trick
这样做DBMS:
SELECT * FROM posts
WHERE page_slug = @slug AND active = 1
ORDER BY (id != @yourID), id DESC, LIMIT @limit
@limit
和@slug
是您当前的变量。 @yourID
变量是您想要的ID。如果不止一个,请使用in()
子句。基本上,对于ID等于您正在寻找的帖子,false
或实际0
,这将返回true
或实际1
},其余的帖子。
因此,对新生成的值应用第一个和升序将导致0
(相同的那些)位于顶部:)
答案 2 :(得分:0)
您可以添加一个名为rank
的新列(或其他有意义的列),将其分配给零以上的值,以获取更重要的行。然后,您先按rank
订购,然后按id
订购。
答案 3 :(得分:0)
如果它还不是某种模块,请将该代码转换为模块并且不要复制它 - 它应该很容易更改。然后,只需将一些INT
字段添加到数据库(例如priority
)和ORDER BY
优先级,然后按ID。