【问题标题】:How can I sort mySQL results in an individual order?如何按单独的顺序对 mySQL 结果进行排序?
【发布时间】:2017-04-11 21:34:16
【问题描述】:
$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>";
}

我的结果是:

  • 三/狐
  • 四个/鼠标
  • 一只/猫
  • 三/刺猬
  • 两个/鸟
  • 一个/大象
  • 一条/鱼
  • 四/斑马
  • 三/猴
  • 两个/狗
  • 我现在想按类别对结果进行排序。不是按第一个字母,而是按逻辑顺序。所以最后我的结果应该是:

  • 一只/猫
  • 一个/大象
  • 一条/鱼
  • 两个/鸟
  • 两个/狗
  • 三/狐
  • 三/刺猬
  • 三/猴
  • 四个/鼠标
  • 四/斑马
  • 当然,这不适用于 ORDER BY ASC。但是有没有办法定义这些类别“一”“二”“三”“四”并说:首先打印所有“一”,然后是“二”......并在这个类别中按名称排序?

    【问题讨论】:

    • 如果你有一个额外的列 CategoryNumber,它是一个表示类别的 int 列,那么 ORDER BY CategoryNumber, Name 就可以了。您的问题是尝试对字符串进行排序,就好像它是一个数字一样。
    • 认为您应该在您的 php 代码中执行此操作。将“字符串数字”转换为数字并对其进行排序
    • 在您的数据库中添加一个名为“order”的列,对于所有“one”插入“1”,对于“two”插入“2” - 然后您可以使用 SQL 的 ORDER BY 功能:)
    • 检查一下,这可能对你有帮助:stackoverflow.com/questions/43320777/…
    • 它也被称为“糟糕的数据库设计”...但是是的,您可以在 PHP 中创建一个可比较的数组(一个 => 1、两个 => 2...)等等,并使用它。

    标签: php mysql pdo


    【解决方案1】:

    您在评论中说过“一”“二”“三”和“四”是唯一可能的值。

    因此您可以使用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

    【讨论】:

    • 看起来不错!我会测试它
    • 工作得很好!实际上正是我想要的!谢谢
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      • 2021-06-29
      • 1970-01-01
      • 1970-01-01
      • 2013-09-08
      相关资源
      最近更新 更多