2016-12-05 54 views
0

我有這個疑問在我的PHP查詢與「ORDER BY」在PHP不能提供準確的結果

<?php 
    $sql = "SELECT * FROM tbl_buttons ORDER BY btn_id" ; 
    foreach ($PDO->query($sql) as $row) 
    { 
     echo '<tr> 
       <td>$row['btn_id']</td> 
       <td>$row['description']</td> 
      </tr>'; 
    } 
?> 

輸出是這樣的:

Button ID | Description 
1   | Assessment 
10  | Registration 
11  | Payroll 
2   | Loan 
3   | Sample 

它按第一個數字,而不是的整數。這就是爲什麼所有具有相同數字的值首先出現。通過它的第一個數字不準確地排序。

+0

它看起來像你的'btn_id'列是一個字符類型。如果還不算太晚,我建議將它改爲數字類型(例如'INT')。如果你不能改變它,那麼'ORDER BY CAST(btn_id AS UNSIGNED)'。 –

+0

它已經是一個整數,但仍然有錯誤。 –

+0

如果它是一個int,你將不會得到那個排序順序。如果它不是一個int,而是像我的答案中那樣將表建議爲ORDER BY btn_id + 0。唯一可以達成的結論是你沒有分享你的實際代碼。 – e4c5

回答

1

它看起來像你的btn_id列是字符類型。所以我建議您將數據類型更改爲整數。

ALTER TABLE tbl_buttons MODIFY btn_id INT 

您可以通過這種方式更改列數據類型。 ,如果你不能夠改變的表,然後使用類似這樣的

SELECT * FROM tbl_buttons ORDER BY CAST(btn_id AS UNSIGNED) 

而且你的PHP代碼就會像

<?php 
    $sql = "SELECT * FROM tbl_buttons ORDER BY CAST(btn_id AS UNSIGNED) ;" ; 
    foreach ($PDO->query($sql) as $row) 
    { 
     echo '<tr> 
       <td>$row['btn_id']</td> 
       <td>$row['description']</td> 
      </tr>'; 
    } 
?> 

請試試這個way.This將工作你的情況。

+0

它已經是一個整數,但它仍然有錯誤。 –

+0

SELECT * FROM tbl_buttons ORDER BY btn_id ASC請嘗試這種方式?這是否給你的情況相同的問題。? –

+0

是的,它仍然是一樣的。 –

4

這是因爲你已經存儲在您的btn_ids在CHAR或VARCHAR列。由於它看起來是整數數據,所以應該將其轉換爲int。

ALTER TABLE tbl_buttons MODIFY btn_id INT 

一個鮮爲人知的解決方案如下:

SELECT * FROM tbl_buttons ORDER BY btn_id+0 

這將導致btn_id場被自動轉換成int修改您的查詢。究其原因,這是劣勢是因爲服務器和查詢規劃可能無法如果存在對btn_id使用索引額外的工作。整數數據應始終保存在INT字段中。

+0

它已經是一個整數,但仍然有錯誤。 –