2

我需要在 MySQL 查询中使用 order by 订购一些信息。只有当第一个字符是数字时,是否有可能使用 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×600
  • 1024 x 768
  • 1280 x 800
  • 1280 x 768
  • 1920 x 1200
  • 2048 x 1536

操作系统

  • 安卓 3.1
  • 安卓
  • 黑莓平板操作系统
  • 安卓 3.2
  • 安卓 2.3
  • 安卓4.0
  • iOS 5
  • 安卓 4.0.3
  • iOS 4
  • 安卓 2.2
  • 视窗 7 专业版
  • 视窗 8
  • 视窗 8 专业版
  • iOS 6

如您所见,英寸和分辨率都还可以,但操作系统的排序不好。如果我删除 ABS,结果将是:

屏幕英寸

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

解析度

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

操作系统

  • 安卓
  • 安卓 2.2
  • 安卓 2.3
  • 安卓 3.1
  • 安卓 3.2
  • 安卓4.0
  • 安卓 4.0.3
  • 黑莓平板操作系统
  • iOS 4
  • iOS 5
  • iOS 6
  • 视窗 7 专业版
  • 视窗 8
  • 视窗 8 专业版

正如您现在所看到的,操作系统的顺序很好,但英寸和分辨率却没有。我希望有人能帮助我:)

4

4 回答 4

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 值)然后order by 的第二个字段(名称)与排序相关。

于 2012-11-30T14:08:02.150 回答
0

试试这个:-

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

假设namenumeric

于 2012-11-30T14:05:18.170 回答
0

你可以使用转换功能:

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

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

ABS(CONVERT(name, SIGNED))
于 2012-11-30T14:09:25.827 回答
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 />';
    }
}
?>

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

于 2013-01-03T20:10:29.987 回答