Intereting Posts

Числовой порядок при возврате результатов из MySQL

У меня есть следующие типы заголовков в таблице в моем db:

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

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

 Topic 1 blah Topic 10 blah blah Topic 11 blah 

… оставив тему 2, тему 3 и т. д. … до тех пор, пока все подростки не получат тему 2 и т. д. …

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

 Topic 1 Topic 2 Topic 3 

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

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

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

Результат:

 'тема 1 foo'
 'тема 2 бар'
 'тема 10 баз'

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

 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'); 

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

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

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

Например:

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

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

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

Что я предлагаю вам сделать, это добавить в таблицу поле INTEGER topic_number и упорядочить по topic_number.

Если вы не можете этого сделать, у вас есть две возможности:

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

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

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

Если эти записи, которые вы указали, находятся в одном поле, тогда ORDER BY делает то, что он делает. Он сортируется в алфавитном порядке и в алфавитном порядке 10 до 2.

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

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

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

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

 OREDER BY CAST(SUBSTRING(topic_name,7) AS UNSIGNED)