从最小到最大排序

时间:2012-09-22 05:48:33

标签: php mysql sql sorting

我在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"

6 个答案:

答案 0 :(得分:4)

这是一个非常糟糕的表格架构。最好的方法是创建一个表格,将它们()分成两列: width height 。例如,

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 Demo

答案 1 :(得分: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

答案 2 :(得分: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');

答案 3 :(得分:1)

更改此查询

select * from mytable order by capacity ASC

select * from mytable order by trim(capacity) ASC

两天前它也帮了我......

答案 4 :(得分:1)

如果您不能重构数据库以将大小存储在两个数字列中,但是您希望在mysql中实现排序而不是php后处理,则可以尝试提取维度并将值转换为数字,类似于

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

您可能需要调整两个子字符串索引部分。

提取所需值的另一种方法:

  • 提取第一个维度(从开头到第一个维度的子字符串":LEFT(dimensions, INSTR(dimensions, '"'))

  • 提取第二个维度(从x之后的子字符串到小于结尾的1个):RIGHT(LEFT(尺寸,LENGTH(尺寸-1)),INSTR(尺寸,' x&#39 ;)+ 1)

答案 5 :(得分:1)

如果可以,请帮助自己。为此数据创建2个separete列,如果您不想在PHP中连接值,请与SQL联系:

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

此外,单独按宽度和高度排序更有效,并产生所需的结果。