|
|
|
Сортировка с использованием SUBSTRING_INDEX
|
|||
|---|---|---|---|
|
#18+
Доброго времени суток, столкнулся с задачей сортировки таблицы адресов. Таблица представляет собой набор названий домов вида: name ------- 15k1 15k4 15k3 15k2 31k1 31k3 31k4 31k2 Чтобы корректно отсортировать по номерам домов использовал: Код: sql 1. Не могу осилить дополнительную сортировку по номерам корпусов, чтобы получить результат вида 15k1;15k2;15k3. Думаю, нужно использовать SUBSTRING_INDEX, но не понятно как именно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2015, 00:06:51 |
|
||
|
Сортировка с использованием SUBSTRING_INDEX
|
|||
|---|---|---|---|
|
#18+
использовать то вот так SUBSTRING_INDEX(name,"к", -1)+0 (-1 - это до первой "к" справа) но это затычка... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2015, 00:16:36 |
|
||
|
Сортировка с использованием SUBSTRING_INDEX
|
|||
|---|---|---|---|
|
#18+
Alex_Ustinov, в таком случае сортировка идет только по части строки после разделителя ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2015, 00:24:24 |
|
||
|
Сортировка с использованием SUBSTRING_INDEX
|
|||
|---|---|---|---|
|
#18+
ну это я добавил плюсом к вашей сортировке... это все не есть хорошо - сортировка по "функции" на больших данных это будет не быстро можно сделать сортировку и по REPLACE(name,"к","") но все дело в количестве цифр в номере дома и номере корпуса (9к1 будет "дальше чем" 10к4 при сравнении строк) 1. для простоты делают доп.поле с фиксированной длиной (дополнением нулей ) для дома и корпуса, т.е. дома 9к4 15к5 будут выглядеть как 00904 01505. триггером заполнить. Или изначально хранят в таком виде с парсингом на клиенте 2. разбить на два поля - номер дома и корпуса ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2015, 01:07:22 |
|
||
|
Сортировка с использованием SUBSTRING_INDEX
|
|||
|---|---|---|---|
|
#18+
... ваш пробка для "бутылки с шампанским" Код: sql 1. и еще куча вариантов приведения строки к фрматированному виду ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2015, 01:15:59 |
|
||
|
Сортировка с использованием SUBSTRING_INDEX
|
|||
|---|---|---|---|
|
#18+
vedroide2e4, Всегда ли присутствует вторая часть в номере дома и всегда ли разделитель "к" ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2015, 10:10:19 |
|
||
|
Сортировка с использованием SUBSTRING_INDEX
|
|||
|---|---|---|---|
|
#18+
vedroide2e4Не могу осилить дополнительную сортировку по номерам корпусов А почему бы не подойти к вопросу системно? нормализовать данные проще, чем заниматься этой фигнёй... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2015, 10:18:19 |
|
||
|
Сортировка с использованием SUBSTRING_INDEX
|
|||
|---|---|---|---|
|
#18+
ну и извечная проблема, которую следует учесть - ЛИТЕР дома (14а 15б), это куда отнести, к номеру дома или как корпус? может такое быть <дом 24 литер "а" корпус 3> ? я не изучал данный вопрос Надо тоже продумывать сразу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2015, 10:23:12 |
|
||
|
Сортировка с использованием SUBSTRING_INDEX
|
|||
|---|---|---|---|
|
#18+
Akinaнормализовать данные прощеЗависит от задачи. Если это один город, где все номера заранее известны, то да, проще. А в общемировом масштабе там такое встречается, что никакой нормализации не хватит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2015, 10:28:50 |
|
||
|
Сортировка с использованием SUBSTRING_INDEX
|
|||
|---|---|---|---|
|
#18+
Alex_Ustinov... ваш пробка для "бутылки с шампанским" Код: sql 1. и еще куча вариантов приведения строки к фрматированному виду Спасибо за рабочее решение. Может, вы и более детально сможете мне ответить. В ситуации, если в таблице присутствуют записи без "kN", например, 15;15k4;15k3; 31;31k4;31k2, предложенный вами вариант сортировки располагает значения без "kN" в конце каждой группы. Логика понятно, но для человека это не очень удобно. Можно ли поместить значения без "kN" в начало? miksoftvedroide2e4, Всегда ли присутствует вторая часть в номере дома и всегда ли разделитель "к" ? Нет, не всегда. Возможен так же вариант с "/" и без разделителя (случаи с Литерой, а не корпусом) Akinavedroide2e4Не могу осилить дополнительную сортировку по номерам корпусов А почему бы не подойти к вопросу системно? нормализовать данные проще, чем заниматься этой фигнёй... Я отталкиваюсь от данности, когда существует массив данных, с которым уже работают. Если я начну переделывать структуру БД и таблиц для данной задачи, то придется менять существующую реализацию всех остальных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2015, 11:16:47 |
|
||
|
Сортировка с использованием SUBSTRING_INDEX
|
|||
|---|---|---|---|
|
#18+
vedroide2e4Я отталкиваюсь от данности, когда существует массив данных, с которым уже работают. В таком случае Вы уже располагаете ВСЕМИ вариантами. И можете их шаблонизировать. Два варианта уже показаны: "NNN" "NNNкMMM" где NNN и MMM - группы цифр неопределённой длины. Какие ещё есть варианты? дайте исчерпывающий список. Тогда можно будет создавать универсальный код требуемой сортировки. Впрочем, он скорее всего будет опираться на один из двух подходов. Первый - это последовательное выделение групп и последовательная же сортировка по значению группы. Второй - это удаление разделителей и приведение групп к постоянной длине с выравниванием вправо и последующая сортировка как строки. Заодно определитесь, как следует сортировать, например, такую группу: 15 15/1 15к1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2015, 11:35:02 |
|
||
|
Сортировка с использованием SUBSTRING_INDEX
|
|||
|---|---|---|---|
|
#18+
Akinaдайте исчерпывающий список. Если говорить о всех возможных вариантах и желаемой сортировке: 15;15k1;15k2;15A;15B;15/1;15/2, т.е. "NNN";"NNNкMMM";"NNNOOO";"NNN/PPP" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2015, 11:46:08 |
|
||
|
Сортировка с использованием SUBSTRING_INDEX
|
|||
|---|---|---|---|
|
#18+
Alex_Ustinovможет такое быть <дом 24 литер "а" корпус 3> ? я не изучал данный вопросСам такого не встречал, но одна госконтора использует такой формат адресов: Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2015, 12:27:28 |
|
||
|
Сортировка с использованием SUBSTRING_INDEX
|
|||
|---|---|---|---|
|
#18+
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2015, 12:39:44 |
|
||
|
Сортировка с использованием SUBSTRING_INDEX
|
|||
|---|---|---|---|
|
#18+
Правда, в примере все дома - 15-е. Чтобы и другие сортировать правильно - первым этапом поставить order by num+0, а потом уже всё остальное. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2015, 12:43:43 |
|
||
|
Сортировка с использованием SUBSTRING_INDEX
|
|||
|---|---|---|---|
|
#18+
Правда, код НЕ учитывает, что номера после "k" или "/" могут быть более одной цифры. Но это можно подрихтовать выделением подстроки и кастом в число. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2015, 12:45:42 |
|
||
|
Сортировка с использованием SUBSTRING_INDEX
|
|||
|---|---|---|---|
|
#18+
vedroide2e4, почему бы вам просто не использовать классификатор адресов ГНИВЦ? http://www.gnivc.ru/inf_provision/classifiers_reference/kladr/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2015, 13:13:37 |
|
||
|
Сортировка с использованием SUBSTRING_INDEX
|
|||
|---|---|---|---|
|
#18+
DBConstructor, это вроде оттуда и есть, там примерно так же хранятся ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2015, 14:01:29 |
|
||
|
Сортировка с использованием SUBSTRING_INDEX
|
|||
|---|---|---|---|
|
#18+
DBConstructor , потому как далеко не все его используют. Соответственно, для использования классификатора нужно данные сначала приводить в нужный вид. А вообще про КЛАДР я подумал в первую очередь. У меня же задача состоит в сортировке того, что имеем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2015, 14:19:59 |
|
||
|
Сортировка с использованием SUBSTRING_INDEX
|
|||
|---|---|---|---|
|
#18+
AkinaПравда, код НЕ учитывает, что номера после "k" или "/" могут быть более одной цифры. Но это можно подрихтовать выделением подстроки и кастом в число. Akina, ваш код прекрасно работает, огромное спасибо. Вы можете наглядно показать то, что вы назвали подрихтовкой? Вы говорите про вариант, когда мы имеем 15k1,15k11,15k2,15k21,15k3? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2015, 14:23:08 |
|
||
|
Сортировка с использованием SUBSTRING_INDEX
|
|||
|---|---|---|---|
|
#18+
vedroide2e4Вы говорите про вариант, когда мы имеем 15k1,15k11,15k2,15k21,15k3? Именно. Просто в этом случае в третьем слое вместо просто num нужно использовать выделяемую подстроку после разделитела ("k" либо "/"). Короче, ещё один CASE. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2015, 14:54:25 |
|
||
|
Сортировка с использованием SUBSTRING_INDEX
|
|||
|---|---|---|---|
|
#18+
Akinavedroide2e4Вы говорите про вариант, когда мы имеем 15k1,15k11,15k2,15k21,15k3? Именно. Просто в этом случае в третьем слое вместо просто num нужно использовать выделяемую подстроку после разделитела ("k" либо "/"). Короче, ещё один CASE. Akina, не могли бы вы показать наглядно? Выделяем подстроку с помощью SUBSTRING_INDEX(num,'k' -1) или SUBSTRING_INDEX(num,'/' -1)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2015, 16:00:14 |
|
||
|
Сортировка с использованием SUBSTRING_INDEX
|
|||
|---|---|---|---|
|
#18+
не забывайте, SELECT SUBSTRING_INDEX("12345678","k",-1) = "12345678" без найденной подстроки вернет строку полностью ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2015, 16:07:08 |
|
||
|
Сортировка с использованием SUBSTRING_INDEX
|
|||
|---|---|---|---|
|
#18+
tanglir, ...ФИАС-вские... ну это разумно, даже если вариантов Литера-корпус нет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2015, 16:11:58 |
|
||
|
Сортировка с использованием SUBSTRING_INDEX
|
|||
|---|---|---|---|
|
#18+
vedroide2e4не могли бы вы показать наглядно? Я показал запрос. И там в ORDER BY есть вполне себе наглядный CASE. vedroide2e4Выделяем подстроку с помощью SUBSTRING_INDEX(num,'k' -1) или SUBSTRING_INDEX(num,'/' -1)? Угу. И не забываем прибавить нолик. Alex_Ustinovне забывайте, SELECT SUBSTRING_INDEX("12345678","k",-1) = "12345678" без найденной подстроки вернет строку полностью Внутри CASE пофиг - на обработку поступают только записи, гарантированно содержащие литерал-разделитель. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2015, 17:18:56 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=39086299&tid=1832569]: |
0ms |
get settings: |
9ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
62ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
39ms |
get tp. blocked users: |
1ms |
| others: | 231ms |
| total: | 379ms |

| 0 / 0 |
