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×480
  • 1024×600
  • 1024×768
  • 1280×800
  • 1280×768
  • 1920×1200
  • 2048×1536

オペレーティング·システム

  • アンドロイド 3.1
  • アンドロイド
  • BlackBerry タブレット OS
  • アンドロイド 3.2
  • アンドロイド 2.3
  • アンドロイド 4.0
  • iOS5
  • アンドロイド 4.0.3
  • iOS4
  • アンドロイド 2.2
  • ウィンドウズ 7 プロフェッショナル
  • ウィンドウズ8
  • ウィンドウズ 8 プロ
  • iOS6

ご覧のとおり、インチと解像度は問題ありませんが、オペレーティング システムは適切に並べられていません。ABS を取り外すと、結果は次のようになります。

画面インチ

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

解像度

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

オペレーティング·システム

  • アンドロイド
  • アンドロイド 2.2
  • アンドロイド 2.3
  • アンドロイド 3.1
  • アンドロイド 3.2
  • アンドロイド 4.0
  • アンドロイド 4.0.3
  • BlackBerry タブレット OS
  • iOS4
  • iOS5
  • iOS6
  • ウィンドウズ 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 の 2 番目のフィールド (名前) は、並べ替えに関連しています。

于 2012-11-30T14:08:02.150 に答える
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 に答える
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 に答える