php - 在 SQL Select 中正确排序小数数据

标签 php mysql sql-order-by

我的数据库列是 varchar(25) 数据类型,其值 1 1/2"、1/2"、3"和 4"代表消防站的软管直径。我遇到的问题是,当我想按升序排序时,以下代码会按上述顺序在数据库中吐出软管直径,这意味着我想要“1/2、1 1/2、3、4”而不是前面的 1 1/2。有没有办法在 SQL 中为我的 varchar 数据类型执行此操作?

// Select hose locations from fire database
$query = "SELECT hose_diameter FROM hose_diameter ORDER BY hose_diameter";
$result = $mysqli->query($query) or die($mysqli->error.__LINE__);

//FETCH ROWS
if($result->num_rows > 0) {
    while($row = $result->fetch_assoc()) {
        print "<option value=\"".$row['hose_diameter']."\">".$row['hose_diameter']."</option>";
    }
}

最佳答案

这是一种方法。它只是摆脱了第一个排序的“1/2”,然后将其添加回去:

order by replace(diam, '1/2', ''), diam

当然,这并不能很容易地推广到其他分数。

另一种方法是在'/'之前的一个字符开始时在前面添加一个'0':

order by (case when diam like '_/%' then '0'+diam else diam end)

最后,您可以使用一个数字形式的直径查找表:

SELECT hd.hose_diameter
FROM hose_diameter hd left outer join
     (select '1/2' as hose_diameter, 0.5 as units union all
      select '1 1/2', 1.5 union all
      select '3', 3 union all
      select '4', 4
     )diams
     on hd.hose_diameter = diams.hose_diameter
ORDER BY diams.units;

其实我更喜欢这种方式,因为意图很明确。

编辑:

我不明白评论。我刚刚测试了这段代码:

with hose_diameter as (
      select '1/2' as diam union all
      select '1 1/2' union all
      select '3'
     )
SELECT hd.diam
FROM hose_diameter hd left outer join
     (select '1/2' as hose_diameter, 0.5 as units union all
      select '1 1/2', 1.5 union all
      select '3', 3 union all
      select '4', 4
     ) diams
     on hd.diam = diams.hose_diameter
ORDER BY diams.units;

它返回:

1/2
1 1/2
3

我测试了第一个版本,它返回相同的顺序。还有第二个版本。

关于php - 在 SQL Select 中正确排序小数数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17533624/

相关文章:

mysql - SQL - 每个日期一条记录

javascript - $http.get AngularJS 不返回数据

javascript - 在同一页面上提交具有已发送状态的联系表

php - PHP 中的错误处理,死亡与异常

sql - 如何更改 sqlite3 数据库的排序规则以不区分大小写排序?

php - MYSQL PHP 的 order by 和 limit 1 返回 null

php - serverList() 只返回 100 个结果

mysql - 使用正确的查询来执行正确的字段定位

php - 1452 - 无法添加或更新子行

Java:使用 PreparedStatement 将多行插入 MySQL