2012-04-13 100 views
1

我有一个问题涉及我目前正在从事的一个项目。 在我的脚本的所有帖子当前显示的是这样的: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开始,并且它跳到第一位置。

有没有人有一个想法,我怎么可以避免这种情况发生,或者至少我可以通过某种方式来调整排序顺序来“欺骗”特定项目在第一个位置?

一些建议将不胜感激。

非常感谢你, 帕特里克

回答

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); 

当然,你不必使用1000作为case语句的ID,但你提到的那个人就是你想在上面的一个的ID ...

+0

谢谢 - 这似乎也是一个非常有趣的解决方案。问题:有没有办法定义多个ID?例如1000,1001和1002? – 2012-04-13 04:20:56

+1

烨,有多个时,/然后语句......例如'当ID = 1000,那么0时,ID = 2002,然后1,否则2'或使用'in'比如'时(1000,2002,3054)ID,然后在0,否则,1 ' – joshuahealy 2012-04-13 04:22:32

+0

见[此页](http://dev.mysql.com/doc/refman/5.0/en/case-statement.html)的case语句 – joshuahealy 2012-04-13 04:23:34

0

您可以添加一个名为rank新列(或别的东西,这是有意义的),把它分配给了这是更重要的排在零以上一定的价值。您将首先按rank订购,然后按id订购。

+0

我已经试过您的解决方案,因为它似乎很简单的使用:。 “\ n ORDER BY排名,id DESC”。 $ PG->限制;但它似乎没有工作 – 2012-04-13 04:11:37

+0

尝试'ORDER BY排名DESC,ID DESC',除非另有规定,否则所有的排序都是递增的。 – Matthew 2012-04-13 04:19:56

0

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

2

你可以trick,如你所说,数据库管理系统是这样的:

SELECT * FROM posts 
WHERE page_slug = @slug AND active = 1 
ORDER BY (id != @yourID), id DESC, LIMIT @limit 

@limit@slug是当前的变量。 @yourID变量是您想要的顶层ID。如果不止一个,则使用in()子句。基本上,这将返回false,或实际0,为后其ID等于你要找的人,和true,或实际1,对于职位的其余部分。

所以,对新产生的价值将第一和升序将导致与0的那些之上(即相等的那些):)

+0

谢谢 - 这听起来像一个伟大的解决方案!谢谢莫斯迪Mostacho – 2012-04-13 04:15:32

+0

欢迎帕特里克:) – 2012-04-13 04:15:50