如果是数字,则由ABS订购

时间:2012-11-30 14:01:33

标签: mysql sql-order-by

我需要在MySQL查询中按顺序订购一些信息。只有当第一个字符是数字时才有可能使用ABS功能吗?

伪示例:

SELECT * FROM table 
ORDER BY
(( name[0] = numeric ) ? ABS(name) : name)
ASC

感谢您到目前为止的答案,尝试了很多答案,但我没有得到我想要的结果。

当前代码:

<?php
$filters = $this->db->query("
    SELECT
        tb_spec_feature.feature_id,
        tb_spec_feature.name
    FROM
        tb_spec_feature
    WHERE
        filter=1
");
$filters = $filters->result_array();
foreach($filters as $key=>$filter)
{
    $filters_sub = $this->db->query("
        SELECT DISTINCT
            tb_spec_value.value_id,
            tb_spec_value.name as value_name,
            tb_spec_sign.name as sign_name
        FROM
            tb_spec_fk
        INNER JOIN
            tb_spec_value
        ON
            tb_spec_value.value_id = tb_spec_fk.value
        LEFT JOIN
            tb_spec_sign
        ON
            tb_spec_sign.sign_id = tb_spec_fk.sign
        WHERE
            feature=".$this->db->escape($filter['feature_id'])."
        ORDER BY
            ABS(tb_spec_value.name) ASC
    ");
    $filters[$key]['values'] = $filters_sub->result_array();
}
?>

这将输出(tb_spec_feature.name,然后是tb_spec_value.name):

屏幕英寸

  • 7
  • 7.7
  • 7.9
  • 8.9
  • 9.7
  • 10
  • 10.1
  • 12.1

解决

  • 800 x 480
  • 1024 x 600
  • 1024 x 768
  • 1280 x 800
  • 1280 x 768
  • 1920 x 1200
  • 2048 x 1536

操作系统

  • Android 3.1
  • 的Android
  • BlackBerry Tablet OS
  • Android 3.2
  • Android 2.3
  • Android 4.0
  • iOS 5
  • Android 4.0.3
  • iOS 4
  • Android 2.2
  • Windows 7专业版
  • Windows 8
  • Windows 8 Pro
  • iOS 6

正如您所看到的那样,英寸和分辨率都可以,但操作系统的排序并不理想。如果我删除ABS,结果将是:

屏幕英寸

  • 10
  • 10.1
  • 12.1
  • 7
  • 7.7
  • 7.9
  • 8.9
  • 9.7

解决

  • 1024 x 600
  • 1024 x 768
  • 1280 x 768
  • 1280 x 800
  • 1366 x 768
  • 1920 x 1200
  • 2048 x 1536
  • 800 x 480

操作系统

  • 的Android
  • Android 2.2
  • Android 2.3
  • Android 3.1
  • Android 3.2
  • Android 4.0
  • Android 4.0.3
  • BlackBerry Tablet OS
  • iOS 4
  • iOS 5
  • iOS 6
  • Windows 7专业版
  • Windows 8
  • Windows 8 Pro

正如您现在所看到的,操作系统排序很好,但英寸和分辨率不是......我希望有人可以帮助我:)

4 个答案:

答案 0 :(得分:3)

此代码是您问题的MySql方式:

SELECT * FROM table 
ORDER BY
CASE WHEN LEFT(name, 1)>='0' AND LEFT(name, 1)<='9' THEN ABS(name) 
     ELSE name 
     END ASC

修改
但根据评论,对你来说更好:

ORDER BY ABS(name), name

以这种方式工作:
如果ABS()可以应用于'name',则数字结果值将被排序,但在相反的情况下,如果ABS(name)求值为null(因为非数字没有abs值)则第二个字段(名称)按顺序排列,与排序有关。

答案 1 :(得分:0)

试试这个: -

CASE WHEN LEFT(name[0], 1) LIKE [0-9] then ABS(name) ELSE name END

假设namenumeric

答案 2 :(得分:0)

你可以使用转换功能:

SELECT * FROM table ORDER BY CONVERT(name, SIGNED)

将所有非数字转换为0,因此您可以安全地将其结果传递给假设整数参数的函数:

ABS(CONVERT(name, SIGNED))

答案 3 :(得分:0)

知道了!但是,不是用SQL .. 我从查询中删除了ABS,在处理查询时我使用了这个:

<?
function order_it($a,$b)
{
    return $a["value_name"] - $b["value_name"];
}

foreach($filters as $key=>$filter)
{
    if(isset($filter['values'][0]['value_name'][0]) AND is_numeric($filter['values'][0]['value_name'][0]))
    {
        usort($filter['values'],'order_it');
    }
    foreach($filter['values'] as $item)
    {
        echo $item['value_name'].'<br />';
    }
}
?>

现在一切都正确订购了:)