我在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"
答案 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
答案 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
此外,单独按宽度和高度排序更有效,并产生所需的结果。