Есть ли возможность отсортировать результат запроса MySQL по "умному"
0,5
2
4
11
52
что то вроде natsort , толь желательно запрос или результат запроса MYSQL
1. -=1100=- - 29 Августа, 2011 - 11:53:49 - перейти к сообщению
2. OrmaJever - 29 Августа, 2011 - 11:59:00 - перейти к сообщению
если тип поля int то имено так и сортирует
3. EuGen - 29 Августа, 2011 - 12:05:31 - перейти к сообщению
К сожалению, нет.
Запрос на добавление в MySQL сортировки по "натуральному алгоритму" - например,
Запрос на добавление в MySQL сортировки по "натуральному алгоритму" - например,
CODE (htmlphp):
скопировать код в буфер обмена
скопировать код в буфер обмена
- Scene 1
- Scene 1A
- Scene 1B
- Scene 2A
- Scene 3
- ...
- Scene 101
- Scene XXA1
- Scene XXA2
- был озвучен сообществом уже давно, однако (насколько я понимаю, из-за покупки компании Sun компанией Oracle) так и не реализовано.
С точки зрения SQL может подойти это:
CODE (SQL):
скопировать код в буфер обмена
скопировать код в буфер обмена
- /**
- * Returns a string formatted for natural sorting. This function is very useful when having to sort alpha-numeric strings.
- *
- * @author Alexandre Potvin Latreille (axp058)
- * @param {nvarchar(4000)} string The formatted string.
- * @param {int} numberLength The length each number should have (including padding). This should be the length of the longest number. Defaults to 10.
- * @param {char(50)} sameOrderChars A list of characters that should have the same order. Ex: '.-/'. Defaults to empty string.
- *
- * @return {nvarchar(4000)} A string for natural sorting.
- * Example of use:
- *
- * SELECT Name FROM TableA ORDER BY Name
- * TableA (unordered) TableA (ordered)
- * ------------ ------------
- * ID Name ID Name
- * 1. A1. 1. A1-1.
- * 2. A1-1. 2. A1.
- * 3. R1 --> 3. R1
- * 4. R11 4. R11
- * 5. R2 5. R2
- *
- *
- * As we can see, humans would expect A1., A1-1., R1, R2, R11 but that's not how SQL is sorting it.
- * We can use this function to fix this.
- *
- * SELECT Name FROM TableA ORDER BY dbo.udf_NaturalSortFormat(Name, default, '.-')
- * TableA (unordered) TableA (ordered)
- * ------------ ------------
- * ID Name ID Name
- * 1. A1. 1. A1.
- * 2. A1-1. 2. A1-1.
- * 3. R1 --> 3. R1
- * 4. R11 4. R2
- * 5. R2 5. R11
- */
- CREATE FUNCTION dbo.udf_NaturalSortFormat(
- @string nvarchar(4000),
- @numberLength int = 10,
- @sameOrderChars char(50) = ''
- )
- RETURNS varchar(4000)
- AS
- BEGIN
- DECLARE @sortString varchar(4000),
- @numStartIndex int,
- @numEndIndex int,
- @padLength int,
- @totalPadLength int,
- @i int,
- @sameOrderCharsLen int;
- SELECT
- @totalPadLength = 0,
- @string = RTRIM(LTRIM(@string)),
- @sortString = @string,
- @numStartIndex = PATINDEX('%[0-9]%', @string),
- @numEndIndex = 0,
- @i = 1,
- @sameOrderCharsLen = LEN(@sameOrderChars);
- -- Replace all char that has to have the same order by a space.
- WHILE (@i <= @sameOrderCharsLen)
- BEGIN
- SET @sortString = REPLACE(@sortString, SUBSTRING(@sameOrderChars, @i, 1), ' ');
- SET @i = @i + 1;
- END
- -- Pad numbers with zeros.
- WHILE (@numStartIndex <> 0)
- BEGIN
- SET @numStartIndex = @numStartIndex + @numEndIndex;
- SET @numEndIndex = @numStartIndex;
- WHILE(PATINDEX('[0-9]', SUBSTRING(@string, @numEndIndex, 1)) = 1)
- BEGIN
- SET @numEndIndex = @numEndIndex + 1;
- END
- SET @numEndIndex = @numEndIndex - 1;
- SET @padLength = @numberLength - (@numEndIndex + 1 - @numStartIndex);
- IF @padLength < 0
- BEGIN
- SET @padLength = 0;
- END
- SET @sortString = STUFF(
- @sortString,
- @numStartIndex + @totalPadLength,
- 0,
- REPLICATE('0', @padLength)
- );
- SET @totalPadLength = @totalPadLength + @padLength;
- SET @numStartIndex = PATINDEX('%[0-9]%', RIGHT(@string, LEN(@string) - @numEndIndex));
- END
- RETURN @sortString;
- END
- GO
(источник http://stackoverflow.com/questions/153633/natural-sort-in-mysql)
Или использовать http://php.su/functions/?natsort