2013-07-08 39 views
2

我的數據庫列是varchar(25)數據類型,其值爲1 1/2「,1/2」,3「和4」,表示消防站的軟管直徑。我遇到的問題是,當我想按升序排列時,以下代碼在數據庫中以上述順序吐出軟管直徑,這意味着我想要「1/2,1,1,3,4」而不是在前面的1 1/2。是否有一種方法可以在我的varchar數據類型中使用小數數據值在SQL中執行此操作?正確分類SQL中的分數數據選擇

謝謝!

PHP代碼

// 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>"; 
    } 
} 
+0

就我個人而言,我會修改您的數據庫,以便您有一個實際的十進制值,然後您可以正確排序。您可以將它們定義爲常規列,也可以基於另一列進行計算,或者只使用小數,然後讓應用程序將其轉換爲可讀的值。或者你可以有一個你加入的翻譯表(比如Gordon的subquery想法,但是有一個真正的表格)也可以假設你的可能值是固定的。但是如果你想把它看作一個數字,我會避免在數據庫中只有一個混合數字字符串。 –

回答

1

這是一種方式。它只是擺脫的「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 

我測試的第一個版本,並返回相同的排序。還有第二個版本。

+0

謝謝,但是當我實現你的代碼時,它只會產生相同的結果。 – jflay

+0

您的前兩個訂單由聲明工作!謝謝 – jflay