2016-12-05 56 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

它已经是一个整数,但仍然有错误。 –