Числовой порядок при возврате результатов из MySQL - PullRequest
2 голосов
/ 28 июля 2010

В моей базе данных есть следующие типы заголовков:

Topic 1 blah blah
Topic 2 blah blah 
Topic 3 blah blah
... 
Topic 10 blah blah
Topic 11 blah blah
etc...

Запрос на выборку всегда будет возвращать результаты, подобные следующим:

Topic 1 blah
Topic 10 blah blah
Topic 11 blah 

... пропуская тему 2, тему 3 и т. Д., Пока подростки не получат тему 2 и т. Д. *

Как я могу получить мои результаты как:

Topic 1
Topic 2
Topic 3

.... весь путь до темы 9 и только потом есть тема 10?

Ответы [ 8 ]

5 голосов
/ 28 июля 2010

Это проблема с дизайном вашей базы данных. Номер темы должен храниться как целое число. Если вы не можете изменить дизайн, попробуйте этот запрос:

SELECT title
FROM table1
ORDER BY CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(title, ' ', 2), ' ', -1)
              AS UNSIGNED);

Результат:

'topic 1 foo'
'topic 2 bar'
'topic 10 baz'

Данные испытаний:

DROP TABLE IF EXISTS table1;
CREATE TABLE table1 (title VARCHAR(100) NOT NULL);
INSERT INTO table1 (title) VALUES
('topic 1 foo'),
('topic 2 bar'),
('topic 10 baz');
2 голосов
/ 28 июля 2010

Я думаю, то, что ищет Уильям, является естественным видом.Я не верю, что это реализовано в mysql.

Если известно, что ваши данные в этом формате, возможно, будет проще использовать substr и, возможно, приведение в порядке.Например:

select title from table order by cast(substr(title, 7) as signed integer);

Однако это плохое решение и не является гибким для других типов данных.Например, новая строка «Z Topics 1» может сломать ее, и любое другое решение, опубликованное до сих пор.Я думаю, что вам нужно либо выполнить внешнюю сортировку на языке, который поддерживает естественную сортировку, либо добавить новый столбец, специфичный для сортировки (например, дату создания)

2 голосов
/ 28 июля 2010

Вы не можете сделать это в SQL. ORDER BY может сортировать по алфавиту, но это всегда ставит тему 10 после темы 1. Я думаю, вам нужно создать новый столбец с фактическим порядком записей.

1 голос
/ 28 июля 2010

Текст сортируется таким образом.Поскольку char "1" меньше, чем char "2", "10" стоит перед "2".Вот почему вы видите темы в этом порядке, а не в цифровом.

Я предлагаю вам добавить в таблицу поле INTEGER topic_number и упорядочить по номеру topic_number.* Если вы не можете сделать это, у вас есть две возможности:

  1. Сортировать темы в PHP.Это легко и быстро, если у вас мало тем.
  2. Дополните номера тем, например Topic 00001 Blah;Тема 00002 Foo;и т. д. Они сортируются в порядке, который вы хотите.Если вы не хотите показывать лидирующие нули, от них легко избавиться: preg_replace('/Topic 0+/', 'Topic ', $text);
0 голосов
/ 28 июля 2010

Я предлагаю вам иметь поле topic_name со значениями 'Topic 1','Topic 2', ... Topic N - «Тема» + Номер.Для сортировки по этому номеру нужно разделить значение поля

OREDER BY CAST(SUBSTRING(topic_name,7) AS UNSIGNED)
0 голосов
/ 28 июля 2010

Если все предоставленные вами записи находятся в одном поле, то ORDER BY делает то, что делает. Сортирует по алфавиту и по алфавиту 10 идет раньше 2.

Лучше всего добавить в таблицу поле «topic_id» с идентификатором темы в числовом формате (убедитесь, что поле имеет числовой тип данных, например, int).

В качестве альтернативы, если это ДЕЙСТВИТЕЛЬНО не вариант, и вы знаете, что формат Заголовка всегда будет одинаковым, вы можете написать пользовательскую функцию и затем вместо нее выполнить свой заказ (но это довольно радикально. Пройдите новый полевой маршрут, если это вообще возможно).

http://dev.mysql.com/doc/refman/5.0/en/adding-functions.html

0 голосов
/ 28 июля 2010

то, что сказал FrustratedWithFormsDes - также звучит немного, как будто идентификатор темы не числовой, а строка

0 голосов
/ 28 июля 2010

Найдите предложение ORDER BY. Вы можете сказать ...ORDER BY TOPIC ASC для заказа по полю TOPIC в порядке возрастания (а DESC даст вам порядок по убыванию). Так как TOPIC выглядит как буквенное поле, вы можете увидеть «Тема 10» перед «Тема 2». Я не уверен, есть ли в MySQL функция естественной сортировки, поэтому вы можете добавить в таблицу столбец значений сортировки. Либо сортируйте по полю идентификатора темы (хотя это не поможет, если темы не добавляются в базу данных последовательно).

...