1

我有一个与我目前正在从事的项目有关的问题。在我的脚本中,所有帖子当前都以这种方式显示:

      $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 开头并且它跳到第一个位置。

有没有人知道如何避免这种情况发生,或者至少我如何通过某种方式调整排序顺序来“欺骗”特定项目以使其处于第一个位置?

一些建议将不胜感激。

非常感谢,帕特里克

4

4 回答 4

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...

于 2012-04-13T04:00:34.003 回答
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,或者实际上,对于其余帖子,这将返回,或者实际上。0true1

因此,对新生成的值应用第一个和升序将导致0顶部带有(相等的)的值:)

于 2012-04-13T04:09:34.000 回答
0

您可以添加一个名为rank(或其他有意义的东西)的新列,将其分配给更重要的行高于零的某个值。然后你会先订购rank,然后订购id

于 2012-04-13T04:00:07.297 回答
0

如果它还不是某种模块,则将该代码转换为模块并且不要复制它 - 它应该很容易更改。然后,只需将一些INT字段添加到数据库(priority例如)和ORDER BY优先级,然后按 ID。

于 2012-04-13T04:01:13.673 回答