2012-04-13 240 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