2011-10-04 50 views
1

排序我有以下查询:MySQL查询与数字

$result = $mysqli->query('SELECT DISTINCT SKU_SIZE_PART1 
          FROM SKU_DATA 
          WHERE SKU_BRANDNAME = "'.$brand.'" 
          ORDER BY SKU_SIZE_PART1 DESC'); 

while($row = $result->fetch_assoc()){ 
    $sku_size1 = $row['SKU_SIZE_PART1']; 

    echo $sku_size1; 
} 

基本上所发生的事情是...的顺序是全乱了。这是什么出现:

9.50, 8.75, 8.00, 7.50, 7.00, 37, 35, 33, 325, 32, 315, 31, 305, 30, 295 

325应该先来,然后315等。

我该怎么做才能做到这一点?

+2

让我猜猜SKU_SIZE_PART1是文本。错错了: - [。 – JonH

+1

“SKU_SIZE_PART1”的数据类型是什么? –

+0

SKU_SIZE_PART1的类型是什么? –

回答

3

您需要将sku_size_part1投入浮动。

这会减慢你的查询下来,但它会工作:

$brand = mysqli_real_escape_string($brand); 
$result = $mysqli->query("SELECT DISTINCT sku_size_part1 
          FROM sku_data 
          WHERE sku_brandname = '$brand' 
          ORDER BY CAST(sku_size_part1 AS FLOAT) DESC"); 

这将减慢查询下来,因为MySQL将无法使用索引来进行排序,使用具有防止该。

更好的解决方案(如果可能的话)将重新定义sku-size_part1作为十进制(10,2)。

-- Make a backup first -- 
ALTER TABLE sku_data CHANGE sku_size_part1 DECIMAL(10,2); 

(确保第一个参数(10),第二个参数(2)大到足以容纳所有可能的值。)
参见:http://dev.mysql.com/doc/refman/5.0/en/cast-functions.html

+3

这可以起作用,但是如果Drew将表格列更改为小数,那么代替投射,效果会更好。 – Kelly

+0

在过去,当我不得不这样做时,为了保留原始数据,我在数据库中添加了一个新列。您可以尝试 'ALTER TABLE sku_data ADD COLUMN sku_size_part1_dec DECIMAL NULL;' 然后您可以进行更新: 'UPDATE sku_data SET sku_size_part1_dec = CAST(sku_size_part1 AS DECIMAL)' – Andrew