2017-04-11 102 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')

    相关问题