Php 在SQL Select中正确排序分数数据

Php 在SQL Select中正确排序分数数据,php,mysql,sql-order-by,Php,Mysql,Sql Order By,我的数据库列是一个varchar(25)数据类型,其值为1 1/2“、1/2“、3”和4”,表示消防站的软管直径。我遇到的问题是,当我想按升序排序时,以下代码在数据库中按上述顺序显示软管直径,这意味着我想要“1/2,1 1/2,3,4”,而不是前面的1/2。有没有一种方法可以在SQL中使用myvarchardatatype的分数数据值来实现这一点 // Select hose locations from fire database $query = "SELECT hose_diameter

我的数据库列是一个
varchar(25)
数据类型,其值为1 1/2“、1/2“、3”和4”,表示消防站的软管直径。我遇到的问题是,当我想按升序排序时,以下代码在数据库中按上述顺序显示软管直径,这意味着我想要“1/2,1 1/2,3,4”,而不是前面的1/2。有没有一种方法可以在SQL中使用my
varchar
datatype的分数数据值来实现这一点

// 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>";
    }
}
//从消防数据库中选择软管位置
$query=“根据软管直径从软管直径顺序中选择软管直径”;
$result=$mysqli->query($query)或die($mysqli->error.\uuuuu行\uuuuuu);
//取行
如果($result->num_rows>0){
而($row=$result->fetch_assoc()){
打印“$行[“软管直径]”;
}
}

这里有一种方法。它只是去掉第一个排序的“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

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

谢谢,但是当我实现您的代码时,它只会产生相同的结果。我个人会修改您的数据库,以便您在其中有一个实际的十进制值,然后您可以正确地排序。您可以将这两个列都作为常规列,或者根据另一个列计算,或者只使用十进制列,让应用程序将其转换为可读值。或者,如果可能的值是固定的,那么您可以有一个与之连接的转换表(就像Gordon的子查询思想,但使用真实的表)也可以工作。但是,如果您想将其视为一个数字,我会避免在数据库中使用混合数字字符串。