Сложный ORDER по дате

Тема в разделе "Базы данных", создана пользователем Extalionez, 18 фев 2013.

Статус темы:
Закрыта.
Модераторы: latteo
  1. Extalionez

    Extalionez Клоун

    Заблокирован
    Регистр.:
    21 авг 2008
    Сообщения:
    368
    Симпатии:
    185
    Доброго всем времени суток!!! Задача следующая. Есть таблица, вывод которой нужно отсортировать по полю дата следующим образом:
    Сначала даты, ближайшие к сегодняшней, по возрастанию. То есть:
    18.02.1012
    18.02.2012
    среди этих одинаковых дат первой должны быть та, которая была создана позже.(в таблице ещё одно datetime-поле created_date)
    19.02.2012
    20.02.1012
    и т.д., а потом уже
    17.02.2012
    16.02.2012
    то есть то, что старше сегодняшней в самом конце должно быть. Есть идеи?:ah:
     
  2. Any_Key

    Any_Key aka mad red cat

    Регистр.:
    30 мар 2006
    Сообщения:
    388
    Симпатии:
    344
    А какая хоть база, точнее какой движек. Если mysql или sqlite то советую забить на это дело. Долго трудно мучительно и скрости 0
    тогда брать свой скрипт/программу и пробовать примеры найденные в гугле по запросу
    bubble sorting (мой язык программирования)
     
    Extalionez нравится это.
  3. Горбушка

    Горбушка Ищу её...

    Регистр.:
    2 май 2008
    Сообщения:
    3.034
    Симпатии:
    2.035
    Переводи дату в формат Unix time... И все проблемы будут решены автоматически.

    Делается это 1 запросом, где стоит просто Order By date. Дальше уже PHP-скриптом ты заносишь все будущие записи в переменную, в формате $text = $date . $text. Дальше выводим сегодняшние, выводим $text, выводим прошлые...
     
    Extalionez нравится это.
  4. Extalionez

    Extalionez Клоун

    Заблокирован
    Регистр.:
    21 авг 2008
    Сообщения:
    368
    Симпатии:
    185
    mysql innodb
    Что-то полчаса думал о чём это, но так и не понял:D
     
  5. Горбушка

    Горбушка Ищу её...

    Регистр.:
    2 май 2008
    Сообщения:
    3.034
    Симпатии:
    2.035
    Смотри, у тебя есть даты... Идут в хаотическом порядке...

    1) Делаем выборку, упорядоченную по датам от большей к меньшей.

    Получаем багу - сначала идут сообщения "из будущего", потом текущие, потом "из прошлого". Нам надо поменять будущие и настоящие местами...

    2) Делаем условие: если дата больше текущей - сохранять эту статью в переменную, а не выводить на экран.

    3) Если дата совпадает - выводим на экран

    4) Если дата меньше текущей - выводим на экран переменную со статьями "из будущего", выводим "из прошлого", продолжая цикл.

    Итог: Сегодня 18, у нас идёт в выборке статьи 24, 23, 22, 18, 17, 16. Скрипт преобразовал это в 18, 24, 23, 22, 17, 16... Нас это тоже не совсем устраивает... Делаем следующее:

    PHP:
    $post 24;
    $post .= 23 $post;
    Итог, мы получили переменную в которой даты идут 22, 23, 24...

    Теперь всё это собираем и получаем что ты хотел:
    18, 22, 23, 24, 17, 16

    Могу на PHP набросать, если всё совсем плохо объяснил...
     
    Extalionez нравится это.
  6. Extalionez

    Extalionez Клоун

    Заблокирован
    Регистр.:
    21 авг 2008
    Сообщения:
    368
    Симпатии:
    185
    набросай плз:ah: Объяснил ты понятно, но я не настолько умный:oops:
    Ты хочешь нарисовать 2 цикла и записывать в них по-порядку данные по условиям даты?
     
  7. Горбушка

    Горбушка Ищу её...

    Регистр.:
    2 май 2008
    Сообщения:
    3.034
    Симпатии:
    2.035
    PHP:
    //Как бы получили данные из мускула
    $array = array (
        
        
    => array ('date' => 24'title' => 'Статья от 24 февраля<br />'),
        
    => array ('date' => 23'title' => 'Статья от 23 февраля<br />'),
        
    => array ('date' => 22'title' => 'Статья от 22 февраля<br />'),
        
    => array ('date' => 18'title' => 'Статья от 18 февраля<br />'),
        
    => array ('date' => 17'title' => 'Статья от 17 февраля<br />'),
        
    => array ('date' => 16'title' => 'Статья от 16 февраля<br />'),
        
    => array ('date' => 15'title' => 'Статья от 15 февраля<br />'),
        
        );

    //Сегодня 18 февраля
    $date 18;
    $i 1//Делается автоматом mysql_fetch_array
    //Обрабатываем в цикле по строчно:
    while ($i 8) { //У тебя здесь будет mysql_fetch_array
        
        
    $day $array[$i]; //Делается автоматом mysql_fetch_array
        
        
    if ($day[date] > $date$post $day['title'] . $post;
        if (
    $day[date] == $date) echo $day['title'];
        if (
    $day[date] < $date) {
            echo 
    $post;
            echo 
    $day['title'];
            
    $post '';
        } 
        
    $i++;
        
    }
    Результат будет:

    HTML:
    Статья от 18 февраля
    Статья от 22 февраля
    Статья от 23 февраля
    Статья от 24 февраля
    Статья от 17 февраля
    Статья от 16 февраля
    Статья от 15 февраля
    Написал топорно, но зато понятно =)
     
    Extalionez нравится это.
  8. Extalionez

    Extalionez Клоун

    Заблокирован
    Регистр.:
    21 авг 2008
    Сообщения:
    368
    Симпатии:
    185
    Код:
    SELECT CASE WHEN  MyDate>=:Date THEN -1 ELSE 1 END AS pr1,
        ABS(DATEDIFF(MyDate,:Date)) AS pr2,
        MyDate,...
      FROM MyTable
      ORDER BY 1,2
    :closed:
     
Статус темы:
Закрыта.