1

mytable にフィールド容量があります。

取得データを容量の小さいものから大きいものの順に並べ替えたい

これらの値は

6" x 12"
6" x 12"
6" x 18"
6" x 12"
10" x 20"
12" x 24"

この結果が欲しい

6" x 12"
6" x 12"
6" x 12"
6" x 18"
10" x 20"
12" x 24"

このクエリを使用する場合

select * from mytable order by capacity ASC

結果よりも

10" x 20"
12" x 24"
6" x 12"
6" x 12"
6" x 12"
6" x 18"

このクエリを使用する場合

select * from mytable order by capacity + 0 ASC

結果よりも

6" x 12"
6" x 12"
6" x 18"
6" x 12"
10" x 20"
12" x 24"
4

6 に答える 6

4

これはテーブルにとって非常に悪いスキーマです。最善の方法は、それら (値) を高さの 2 つの列に分けるテーブルを作成することです。例、

CREATE TABLE Dimension
(
   ID INT AUTO_INCREMENT,
   `Width` INT,
   `Height` INT,
   CONSTRAINT tb_pk PRIMARY KEY (ID)
);

次に、このようにレコードを挿入できます。

INSERT INTO Dimension (`Width`, `Height`) VALUES (6, 12), (6,18), (10, 12);

このクエリを使用して結果を並べ替えるだけです

SELECT *
FROM Dimension
ORDER BY (`width` * `height`) DESC

ただし、スキーマを変更せずに質問に答えるには、USER DEFINE FUNCTIONサーバーに を作成し、

CREATE FUNCTION SPLIT_STR
(
  x VARCHAR(255),
  delim VARCHAR(12),
  pos INT
)
RETURNS VARCHAR(255)
RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos),
       LENGTH(SUBSTRING_INDEX(x, delim, pos -1)) + 1),
       delim, '');

次に、このクエリを使用して、

SELECT CAST(SPLIT_STR(REPLACE(`capacity`, '"', '') ,'x', 1) as SIGNED) width,
       CAST(SPLIT_STR(REPLACE(`capacity`, '"', '') ,'x', 2) as SIGNED) height
FROM tableName
ORDER BY  (width * height) DESC

SQLFiddle デモ

于 2012-09-22T06:10:29.313 に答える
3

あなたはこれを試してみるべきです...

SELECT *, SUBSTRING_INDEX(capacity, 'x', 1) AS width, 
    SUBSTRING_INDEX(capacity, 'x', -1) AS height 
FROM mytable 
ORDER BY width+0 ASC, height+0 ASC
于 2012-09-22T06:02:44.357 に答える
1

これを行う 1 つの方法は、結果をループして各値を乗算することです。後でカスタムソートを使用すると、探している結果が得られます。

$sortedArray = array();
$array       = array(
    '6" x 12"', '6" x 18"', '6" x 12"', '6" x 12"', '10" x 12"'
);

// loop through rowset
foreach ($array as $row) {
    $parts = explode(' x ', str_replace('"', '', $row));
    $sortedArray[][($parts[0] * $parts[1])] = $row;
}

// custom sort - PHP 5.3 required for anonymous functions
usort($sortedArray, function($a, $b) {
    return (array_keys($a) > array_keys($b));
});

または、PHP 5.3 を使用していない場合は、次のように usort を変更できます。

function mySort($a, $b)
{
    return (array_keys($a) > array_keys($b));
}

usort($sortedArray, 'mySort');
于 2012-09-22T05:50:28.753 に答える
1

このクエリを変更

select * from mytable order by capacity ASC

select * from mytable order by trim(capacity) ASC

2日前もお世話になりました…

于 2012-09-22T05:57:16.653 に答える
1

データベースをリファクタリングしてサイズを 2 つの数値列に格納することはできないが、PHP の後処理ではなく mysql でソートを実現したい場合は、次のように次元を抽出して値を数値にキャストすることができます。

SELECT dimensions
FROM mytable
ORDER BY
    CAST(SUBSTRING_INDEX(dimensions, '"', 1) AS SIGNED) * 
    CAST(SUBSTRING_INDEX(LEFT(dimensions, LENGTH(dimensions)-1), ' ', -1) AS SIGNED)
    ASC

または、より良いのは、Ashwini の答えに似ています。

SELECT dimensions
FROM mytable
ORDER BY
    (SUBSTRING_INDEX(dimensions, 'x', 1) + 0) * 
    (SUBSTRING_INDEX(dimensions, 'x', -1) + 0)
    ASC

おそらく、2 つの部分文字列インデックス部分を微調整する必要があります。

必要な値を抽出する別の方法:

  • 最初の次元を抽出します (最初から最初までの部分文字列 ":LEFT(dimensions, INSTR(dimensions, '"'))

  • 2 番目の次元 (x の後の部分文字列から末尾より 1 小さいものまで) を抽出します: RIGHT(LEFT(dimensions, LENGTH(dimensions-1)), INSTR(dimensions, 'x') + 1)

于 2012-09-22T06:10:03.163 に答える
1

可能であれば、自分のためにお願いします。このデータ用に 2 つの個別の列を作成し、PHP で値を連結したくない場合は、SQL で接続します。

select contact(width, '" x ', height, '"') as capacity from mytable order by width asc, height asc

また、幅と高さを別々に注文すると、はるかに効率的で、目的の結果が得られます。

于 2012-09-22T06:19:10.957 に答える