Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сортировка в БД 
:(
    Опции темы
Avtor
Дата 4.9.2006, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 111
Регистрация: 21.7.2006

Репутация: нет
Всего: нет



Код

SELECT * from tbl1 ORDER BY razd

Выдает:
Раздел 10
Раздел 2
Раздел 3
Раздел 4
Можно как-нибудь поправить ситуацию средствами SQL?
PM MAIL   Вверх
Akina
Дата 4.9.2006, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Конечно. Сортировать не по текстовому полю, а привести его к чисельному.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Ignat
Дата 4.9.2006, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

Репутация: 21
Всего: 73



Цитата(Akina @  4.9.2006,  11:30 Найти цитируемый пост)
Конечно. Сортировать не по текстовому полю, а привести его к чисельному.

А можно так, если, конечно, формат постоянен:

Код

SELECT `razd`, LENGTH(`razd`) AS `len` FROM `tbl1` ORDER BY `len`, `razd`;




--------------------
Теперь при чем :P
PM   Вверх
Avtor
Дата 4.9.2006, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 111
Регистрация: 21.7.2006

Репутация: нет
Всего: нет



КАк же его привести к чисельному?
PM MAIL   Вверх
Ignat
Дата 4.9.2006, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

Репутация: 21
Всего: 73



Цитата(Avtor @  4.9.2006,  12:04 Найти цитируемый пост)
КАк же его привести к чисельному?

Выделить из текста число строковыми ф-циями (e.g. SUBSTRING ) и воспользоваться функцией CAST для преобразования.


--------------------
Теперь при чем :P
PM   Вверх
Avtor
Дата 4.9.2006, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 111
Регистрация: 21.7.2006

Репутация: нет
Всего: нет



Вы можете привести код, а то мне на таком уровне нелегко общаться с MySQL.
PM MAIL   Вверх
Ignat
Дата 4.9.2006, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

Репутация: 21
Всего: 73



Что-то вроде:
Код

SELECT CAST( SUBSTRING( `razd`, LENGTH( 'Раздел ') ) AS INT ) AS `ordering`, ... FROM `tbl1` ORDER BY `ordering`;


За подробностями к мануалу smile


--------------------
Теперь при чем :P
PM   Вверх
Avtor
Дата 4.9.2006, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 111
Регистрация: 21.7.2006

Репутация: нет
Всего: нет



Пишу:
Код

SELECT CAST(SUBSTRING('razd', LENGTH('Раздел ')) AS INT) AS 'ordering' FROM 'learn_razd' ORDER BY 'ordering'

Говорит "ошибка рядом с (SUBSTRING('razd', LENGTH('Раздел ')) AS INT) AS 'ordering' FROM 'learn_razd' ORDER BY 'ordering'"! 
PM MAIL   Вверх
Ignat
Дата 4.9.2006, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

Репутация: 21
Всего: 73



Avtor, вопрос - версия БД?

Обратите внимание на кавычки!


--------------------
Теперь при чем :P
PM   Вверх
muzer
Дата 4.9.2006, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 387
Регистрация: 31.8.2006

Репутация: 30
Всего: 31



Технические извращения правильные приведены smile
Но, по-моему, ошибка заключается в проектировании структуры базы данных, конкретно данной таблицы.
Если порядок сортировки каких-либо сущностей не может быть определён обычным ORDER BY, а требует вычленения подстрок для сортировки результата, то правильным решением является заведение дополнительного числового поля в таблице, определяющего порядок сортировки.
Потому что рано или поздно появятся строки вида "Подраздел 1" "Подраздел 2", а потом "Меню 1" "Меню 2" и т.д. и техническое извращение будет всё извращённее и извращённее)
PM WWW   Вверх
Ignat
Дата 4.9.2006, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

Репутация: 21
Всего: 73



Цитата(muzer @  4.9.2006,  20:15 Найти цитируемый пост)
Но, по-моему, ошибка заключается в проектировании структуры базы данных, конкретно данной таблицы.

Естествено... Хранить явно избыточное слово "Раздел" совершенно не к чему, а ежель кроме раздела подразумевается подраздел, то уже нормализовать стоит.


--------------------
Теперь при чем :P
PM   Вверх
muzer
Дата 4.9.2006, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 387
Регистрация: 31.8.2006

Репутация: 30
Всего: 31



Цитата(Ignat @  4.9.2006,  20:44 Найти цитируемый пост)
Естествено... Хранить явно избыточное слово "Раздел" совершенно не к чему, а ежель кроме раздела подразумевается подраздел, то уже нормализовать стоит.

Это была первая моя мысль. Потом я подумал - а почему бы и нет, не прибивать же гвоздями это слово где-то ещё, даже если оно и повторяется в 5 строках. Это навигация, она может меняться, могут добавляться новые пункты с другими словами. Нормализовать - а стоит ли овчинка выделки? Заводить целую таблицу и механизм внесения изменений ради чего? smile

Оффтопик: нормализация - это зло в двух крайних точках: 1. когда данных очень мало (потому что механизм работы с тучей таблиц сложнее) 2. когда данных очень много (потому что быстрая выборка данных становится невозможной).
PM WWW   Вверх
Ignat
Дата 4.9.2006, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

Репутация: 21
Всего: 73



Продолжаю оффтопик:
Цитата(muzer @  4.9.2006,  20:55 Найти цитируемый пост)
1. когда данных очень мало (потому что механизм работы с тучей таблиц сложнее)

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

Цитата(muzer @  4.9.2006,  20:55 Найти цитируемый пост)
2. когда данных очень много (потому что быстрая выборка данных становится невозможной). 

А вот тут, наверное, не соглашусь. Если правильно расставлены индексы, то снижение скорости, как правило, незначительно.



--------------------
Теперь при чем :P
PM   Вверх
muzer
Дата 4.9.2006, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 387
Регистрация: 31.8.2006

Репутация: 30
Всего: 31



Цитата(Ignat @  4.9.2006,  21:05 Найти цитируемый пост)
А вот тут, наверное, не соглашусь. Если правильно расставлены индексы, то снижение скорости, как правило, незначительно.

Проверено на практике, что если в таблицу со 100 млн строк добавить избыточное поле, то выборка будет быстрее, нежели джойн этой таблицы с другой (хоть у другой праймари кий и строк всего 1-2 млн). Особенно это "быстрее" заметно, если селекты повторяются регулярно smile
И проверено не однократно, ни на одной таблице, а ежедневно на сотнях таблиц smile Нормализация сохраняет дисковое пространство, сохраняет гибкость системы, но плохо сказывается на её производительности.
Но конечно же не претендую на абс истину, возможно, у кого-то есть другой опыт.
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0693 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.