如何在单个订单中对mySQL结果进行排序?

时间:2017-04-11 13:07:55

标签: php mysql pdo

$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>";
}

我的结果是:

  • 三/狐狸
  • 四/小鼠
  • one / cat
  • 三/刺猬
  • 两只/鸟
  • one / elefant
  • one / fish
  • four / zebra
  • 三/猴子
  • two / dog
  • 我想按类别排序结果。不是通过第一个字母,而是按逻辑顺序。所以最后我的结果应该是:

  • one / cat
  • one / elefant
  • one / fish
  • 两只/鸟
  • 两只/狗
  • 三/狐狸
  • 三/刺猬
  • 三/猴子
  • 四/小鼠
  • four / zebra
  • 当然这不适用于ORDER BY ASC。但有没有办法定义这些类别“一”,“两”,“三”,“四”,并说:首先打印所有“一”,然后“两个”...并在这个类别中按名称排序?

    2 个答案:

    答案 0 :(得分:3)

    你已经在你的评论中说过&#34;一个&#34; &#34; 2&#34; &#34;三&#34;和&#34;四&#34;是唯一可能的价值观。

    因此,您可以使用FIND_IN_SET()功能来实现这一目标。

    尝试:

    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')以逗号分隔值category为单位返回给定'one,two,three,four'值位置的索引(从1到n)。

    例如,如果category = 'three',则FIND_IN_SET(category,'one,two,three,four') = 3

    答案 1 :(得分:2)

    您可以在自定义上使用FIELD进行排序。
    SELECT * FROM animals WHERE id = ? ORDER BY FIELD(category, 'one','two','three')