За последние 24 часа нас посетили 16556 программистов и 1679 роботов. Сейчас ищут 827 программистов ...

Специальная сортировка данных из БД

Тема в разделе "PHP и базы данных", создана пользователем tectolog, 1 фев 2011.

  1. tectolog

    tectolog Активный пользователь

    С нами с:
    1 фев 2011
    Сообщения:
    7
    Симпатии:
    0
    На данный момент выборка сортируется через ORDER BY ASC следующим образом: символ "-", цифра, буква.
    Стоит задача, чтобы сортировка была: цифра, буква, символ "-"
    Перекопал кучу инфы, нашел несколько вариантов решения:
    1. в ORDER BY использовать CASE
    2. найти collation с сортировкой цифра, буква, -
    3. написать свой файл с правилами сортировки (collate)
    4. писать пользовательскую функцию для метода пузырька с применением диапазонов
    Пункт 4-ый для меня приемлем, метод пузырька нашел на php, теперь не могу понять логику действий применительно к диапазонам, я так понимаю, что надо делать диапазон для цифр, отдельно - букв и для "-"
    Подскажите что-нибудь по этой теме.
    Заранее спасибо.
     
  2. tectolog

    tectolog Активный пользователь

    С нами с:
    1 фев 2011
    Сообщения:
    7
    Симпатии:
    0
    P.S. забыл сказать - данные выгребаются из одного столбца и размещение данных в несколько столбцов не предусматривается. :)
     
  3. яфпкк

    яфпкк Активный пользователь

    С нами с:
    3 фев 2011
    Сообщения:
    3
    Симпатии:
    0
    ну как вариант:
    create table #tmp

    insert into #tmp
    выбрать все строки, где первая цифра
    order by ...

    insert into #tmp
    выбрать все строки, где первая буква
    order by ...

    insert into #tmp
    выбрать все строки, где "-"

    select * from #tmp
    drop table #tmp
     
  4. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    tectolog
    добавляешь ещё одно поле, по которому будешь производить сортировку.
    в то поле заносишь текст, по которому ты сортировал раньше, только внутри данного текста
    заменяешь все дефисы на пробелы. Т.к. пробел идёт раньше любого другого символа,
    то сортировка по данному полю будет той, что нужна.
     
  5. tectolog

    tectolog Активный пользователь

    С нами с:
    1 фев 2011
    Сообщения:
    7
    Симпатии:
    0
    спасибо за варианты, просто не успел отписаться еще об одном найденном решении:
    usort($array, strnatcmp); - готовая функция php
     
  6. tectolog

    tectolog Активный пользователь

    С нами с:
    1 фев 2011
    Сообщения:
    7
    Симпатии:
    0
    Вопрос в связи с вышеизложенным:
    на самом деле нужна была сортировка как в Excel по алфавиту, заметил и не могу понять одну странность, далее
    отсортированный Excel-ем по алфавиту фрагмент списка:
    а-в-т-о-б-у-с
    а-в-т-о-б-у-с-ы
    автовинилъ
    автодлясвадьбы
    авто-для-свадьбы
    автодлясвадьбывмоскве
    авто-для-свадьбы-в-москве
    а-в-т-о-з-в-у-к
    автозвукъ
    авто-звукъ
    автомобиль-для-свадьбы
    автомобиль-для-свадьбы-в-москве
    автомобиль-для-свадьбы-недорого
    автомобиль-на-свадьбу
    автомобиль-на-свадьбу-в-москве
    автомобиль-на-свадьбу-недорого
    авто-на-свадьбу-в-москве
    а-в-т-о-р-е-м-о-н-т
    авторемонтъ
    автосервис-мск
    автосервис-ооо
    автосервисы-мск
    автотехцентръ
    а-в-т-о-т-ю-н-и-н-г
    автотюнингъ
    авто-тюнингъ
    агетствадетективные
    агетства-детективные
    а-л-к-о-г-о-л-ь
    алкогольвмоскве
    алкоголь-в-москве
    алкоголь-качественный

    стиранным и нелогичным для меня является расположение таких слов, как а-в-т-о-з-в-у-к, а-в-т-о-р-е-м-о-н-т, b]а-в-т-о-т-ю-н-и-н-г[/b] - почему они находятся посреди алфавитного массива, а не после буквенных символов?
     
  7. tectolog

    tectolog Активный пользователь

    С нами с:
    1 фев 2011
    Сообщения:
    7
    Симпатии:
    0
    хотя, реально, эти дефисные слова предваряют алфавитное размещение
     
  8. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    tectolog
    смею предположить, что эксель при сортировке тупо игнорирует "небуквы".

    т.е. список получается:

    так понятнее?
     
  9. tectolog

    tectolog Активный пользователь

    С нами с:
    1 фев 2011
    Сообщения:
    7
    Симпатии:
    0
    да про это все понятно.
    Теперь задача немного меняется, уточняю еще исходные данные:
    в БД находятся строки 2-ух видов - как бы слитное написание и раздельное, не все слитные строки дублируются раздельным написанием.
    Задача:
    выводить так чтобы в целом шла сортировка в алфавитном порядке, но если у строки есть дублер с раздельным написанием, то дублер помещать в массив сразу после своего слитного оригинала - вот... вот так.
    В связи с этим, что лучше: писать пользовательскую функцию для разбора массива или писать сложный запрос в БД?
    Кто сталкивался с такими наворотами?
    Спасибо.
     
  10. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Можно создать процедуру в БД и использовать её для разбора.
    Можно разбирать это в приложении.