Php 从最小到最大排序

Php 从最小到最大排序,php,mysql,sql,sorting,Php,Mysql,Sql,Sorting,我的表中有一个字段容量 我想按容量从最小到最大对提取数据进行排序 这些值是 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 select * from mytable order by capa

我的表中有一个字段容量

我想按容量从最小到最大对提取数据进行排序

这些值是

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
select * from mytable order by capacity + 0 ASC
结果是

10" x 20"
12" x 24"
6" x 12"
6" x 12"
6" x 12"
6" x 18"
6" x 12"
6" x 12"
6" x 18"
6" x 12"
10" x 20"
12" x 24"
如果我使用这个查询

select * from mytable order by capacity ASC
select * from mytable order by capacity + 0 ASC
结果是

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

一种方法是循环遍历结果并将每个值相乘。然后使用自定义排序,您就可以得到您要查找的结果

$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));
});
或者,如果您没有PHP5.3,则可以简单地更改usort,如下所示:

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

usort($sortedArray, 'mySort');

一种方法是循环遍历结果并将每个值相乘。然后使用自定义排序,您就可以得到您要查找的结果

$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));
});
或者,如果您没有PHP5.3,则可以简单地更改usort,如下所示:

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

usort($sortedArray, 'mySort');
更改此查询

select * from mytable order by capacity ASC

两天前它还帮了我……

更改了此查询

select * from mytable order by capacity ASC

两天前它还帮了我…

你应该试试这个

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
你应该试试这个

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

如果无法重构数据库以将大小存储在两个数字列中,但希望在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
或者,与阿什维尼的回答类似:

SELECT dimensions
FROM mytable
ORDER BY
    (SUBSTRING_INDEX(dimensions, 'x', 1) + 0) * 
    (SUBSTRING_INDEX(dimensions, 'x', -1) + 0)
    ASC
您可能需要调整两个子字符串索引部分

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

  • 提取第一个维度(从开始到第一个子字符串):
    LEFT(维度,INSTR(维度,“”))

  • 提取第二个维度(从x后面到比端点小1的子字符串):右(维度,长度(维度-1)),INSTR(维度,'x')+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
或者,与阿什维尼的回答类似:

SELECT dimensions
FROM mytable
ORDER BY
    (SUBSTRING_INDEX(dimensions, 'x', 1) + 0) * 
    (SUBSTRING_INDEX(dimensions, 'x', -1) + 0)
    ASC
您可能需要调整两个子字符串索引部分

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

  • 提取第一个维度(从开始到第一个子字符串):
    LEFT(维度,INSTR(维度,“”))

  • 提取第二个维度(从x后面到比端点小1的子字符串):右(维度,长度(维度-1)),INSTR(维度,'x')+1)


这是一个非常糟糕的表格模式。最好的方法是创建一个表格,将它们(值)分成两列:宽度和高度。例如

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

但要回答您的问题而不更改模式,请在服务器中创建一个
用户定义函数

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

这是一个非常糟糕的表模式。最好的方法是创建一个表,将它们(值)分成两列:宽度和高度。例如

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

但要回答您的问题而不更改模式,请在服务器中创建一个
用户定义函数

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

如果可以的话,帮自己一个忙。为此数据创建两个单独的列,如果不想在PHP中连接这些值,请使用SQL联系:

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

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

如果可以,请帮自己一个忙。为此数据创建两个单独的列,如果不想在PHP中连接值,请与SQL联系:

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

另外,按宽度和高度分别排序更有效,并产生所需的结果。

它们是以字符串形式存储的吗?列名和内容是什么?如果您愿意,我可以为您编写一个脚本?是否可以编辑表?如果可能,您可能会发现使用两个数字列进行排序更好ore此数据,而不是一个字符串。容量字段为varchar(255)@PradeepSingh为什么不更改表的模式?请参阅下面的答案。它们是否以字符串的形式存储?列名和其他内容是什么?如果您愿意,我可以为您编写一个脚本?是否可以编辑表?如果可能,您可能会发现使用两个数字列来存储这些数据要比使用一个数字列好得多字符串。容量字段为varchar(255)@PradeepSingh为什么不更改表的架构?请参阅下面的答案。这确实是最好的答案。如果绝对不可能更改表的架构,请仅使用其他答案中的一个。@jmilloy我不同意。这是最好的解决方案,但不是最好的答案。这是不同的。OPs通常没有访问权限、时间等c来进行类似于John Woo建议的更改。@John Woo为什么要创建一个函数SPLIT_STR而不是使用子字符串索引?我在数据库中有大量数据,这些值不相同SyntaxValues是1/4“x 4',1 3/4”x 4',1吨x 03”这确实是最好的答案。如果绝对不可能更改表的架构,请使用其他答案中的一个。@jmiloy我不同意。这是最好的解决方案,但不是最好的答案。这是不同的。通常情况下,OPs没有权限、时间等来进行类似于John Woo建议的更改。@John Woo为什么要这样做您创建了一个函数SPLIT_STR而不是使用子字符串_INDEX?我在数据库中有大量数据,值不相同SyntaxVaslue是1/4“x 4',1 3/4”x 4',1吨x 03”