mysql排序顺序操作

时间:2012-04-13 03:57:12

标签: mysql

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

      $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 个答案:

答案 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。