MySql естественная сортировка со смещением от определенного значения - PullRequest
1 голос
/ 19 апреля 2011

У меня есть данные:

CREATE TABLE IF NOT EXISTS `sort` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `value` varchar(50) NOT NULL,
  PRIMARY KEY (`id`)
);

INSERT INTO `sort` (`id`, `value`) VALUES
    (1, 'abc2'),
    (2, 'abc20'),
    (3, 'abc1'),
    (4, 'abc10'),
    (5, 'abc3');

Я хочу, чтобы все строки начинались с указанного идентификатора, а затем до конца этого набора результатов, чтобы были добавлены все строки до указанного идентификатора и все отсортированопо значению.

Итак, я получаю следующее:

SET @id=3;
SELECT * FROM sort
ORDER BY 
id=@id DESC, value>=(SELECT value FROM sort WHERE id=@id) DESC, value ASC;

Все работает нормально, но это не естественная сортировка.С запросом выше я получаю результат abc1, abc10, abc2, abc20, abc3.Результат, который я ищу - abc1, abc2, abc3, abc10, abc20.И, конечно, если я изменю @ id = 4, результат будет abc10, abc20, abc1, abc2, abc3.

. С помощью запроса, приведенного ниже, я получаю нужную естественную сортировку.

SELECT * FROM sort ORDER BY LENGTH(value), value; 

Итак, вопрос: Как объединить два предложения ORDER BY в одно?

1 Ответ

0 голосов
/ 31 мая 2011

Это должно работать:

SELECT * 
FROM sort 
ORDER BY  
    id=@id DESC,
    LENGTH(value),
    value>=(SELECT value FROM sort WHERE id=@id) DESC, 
    value ASC;`
...