2017-04-11 100 views
1
$pdo = $db->prepare('SELECT * FROM animals WHERE id = ?'); 
$pdo->execute(array($id)); 
$animals = $pdo->fetchAll(); 

foreach ($animals as $row) { 
    echo "<li>".$row["category"]."/".$row["name"]."</li>"; 
} 

我的結果是:我如何根據個人訂單對mySQL結果進行排序?

  • 三輪/狐狸
  • 四/鼠標
  • 一個/貓
  • 三輪/刺蝟
  • 二/鳥
  • 一個/ Elefant酒店
  • one/fish
  • four /斑馬
  • 三輪/猴
  • 二/狗
  • 我想現在按類別搜索結果。不是按首字母,而是按邏輯順序。那麼,到底我的結果應該是:

  • 一個/貓
  • 一個/ Elefant酒店
  • 一個/魚
  • 二/鳥
  • 二/狗
  • 三輪/狐狸
  • three/hedgehog
  • three/monkey
  • four/mouse
  • 四/斑馬
  • 當然這不適用於ORDER BY ASC。但是有沒有辦法將這些類別定義爲「一個」「兩個」「三個」「四個」並且說:首先打印所有的「一個」,然後是「兩個」......並且在這個類別中按名稱排序?

    +0

    如果您有一個額外的列CategoryNumber,它是一個表示類別的int,那麼'ORDER BY CategoryNumber,Name'就可以工作。你的問題是試圖對一個字符串進行排序,就好像它是一個數字一樣。 – ADyson

    +0

    認爲你應該在你的php代碼中做到這一點。將「字符串號」轉換爲數字並對其進行排序 – Jens

    +0

    在數據庫中添加一個名爲「order」的列,對於所有的「one」插入「1」,對於「two」插入「2」 - 然後可以使用ORDER BY函數SQL :) – Twinfriends

    回答

    3

    你已經在你的評論中說過「一個」「兩個」「三個」和「四個」是唯一可能的值。

    因此,您可以使用FIND_IN_SET()函數來實現該功能。在集逗號分隔值'one,two,three,four'的給定值category的位置

    SELECT * FROM animals 
    WHERE id = ? 
    ORDER BY FIND_IN_SET(category,'one,two,three,four') ASC, name ASC 
    

    FIND_IN_SET(category, 'one,two,three,four')返回指數(從1到n):

    嘗試。

    因此,舉例來說,如果category = 'three',然後FIND_IN_SET(category,'one,two,three,four') = 3

    +0

    這看起來不錯!我會測試它 – Jarla

    +0

    工作得很好!其實正是我在找的!謝謝 – Jarla

    2

    可以使用field命令上的自定義。
    SELECT * FROM animals WHERE id = ? ORDER BY FIELD(category, 'one','two','three')

    相關問題